算法思路:
将n个元素分成【已排序】和【未排序】两部分。每次将【未排序】中的一个元素取出,插入到已排序中的相应位置。直至所有元素排序完毕。
【已排序】 【未排序】
{ { a[0] } , { a[1],a[2],a[3]....a[n-1] } }
{ { a[0] , a[1] } , { a[2],a[3] ....a[n-1] } }
{ { a[0] ,a[1],a[2] } , { a[3]......a[n-1] } }
性质:
插入排序是一种原地排序(只有常数个元素存到数组以外的空间),平均时间复杂度和最坏的时间复杂度都是n2。且它是稳定的排序算法。
代码如下:
static void Main(string[] args) { var a= new int[]{5,3,1,9,4,32,2}; for (int i = 1; i < a.Length; i++) //外层循环:遍历数组,从第二个元素开始 { int num= a[i]; //将待插入元素存入num int index = i; //记录待插入元素下标 for (int j = i-1; j >= 0; j--) //内层循环:遍历待【插入元素之前】所有已经排好顺序的数组 { if( num < a[j]) // *如果待插入元素小于前一个元素,向后赋值一位* { a[index] = a[index -1]; index--; } else if (num >= a[j]) { break; } //找到插入位置,跳出内层循环 } a[index] = num; //插入到相应位置 } foreach (var item in a) { Console.Write(" " + item); } Console.Read(); }
直观示意:
当原数组:{5,3,1,9,4,32,2} 前四位已经排好变成: {1,3,5,9,4,32,2} 的时候,该排4了, 数组的实际变化如下。