插入排序试用于小数据且基本有序的数组,因为每次插入数据都要遍历比较大小。那么大数据且基本无序的数组呢。
这是需要时用到希尔排序,希尔排序是分组版本的插入排序。
如何分组?
假设又如下数组:
{49,38,65,97,76,13,27,49,55,04}
第一次分组,增量一般是一半
那么此时增量是5,也就是说,49和13一组,38和27一组...
划分的组是:
49---13 13---49
38---27 27---38
65---49 插入排序后 =》 49---65
97---55 55---97
76---04 04---76
得到:
{13,27,49,55,04,49,38,65,97,76}
第二次,增量变为原增量一半,取不到整数,取小于它的最大整数
也就是说,此时增量变为2
那么变为
13---49---04---38---97 04---13---38---49---97
插入排序后 =》
27---55---49---65---76 27---49---55---65---76
得到:
{04,27,13,49,38,55,49,65,97,76}
最后,增量变为1,不可再小
{04,13,27,38,49,49,55,65,76,97}
经过小数据量的几轮插入排序,数组已经变的基本有序了,在进行插入排序也就简单了
代码实现如下:
int[] arr = { 1, 9, 2, 4, 6, 7, 3,5}; //计算初始增量 for(double gap = arr.Length / 2; gap>0;gap=Math.Floor(gap/2)) { //增量后面的数 for(int i=(int)gap; i<arr.Length; i++) { int temp = arr[i]; int j; //换位置移动的是增量的长度,而不是1 for(j=i-(int)gap;j>=0 && arr[j] > temp; j-=(int)gap) { //互换位置,而不是向后移动 arr[j+(int)gap] = arr[j]; } arr[j + (int)gap] = temp; } }
输出如下: