希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。
算法的具体步骤为:
- 先取一个正整数 d1,所有距离为 d1的倍数的记录看成一组,然后在各组内进行插入排序。
- 然后取 d2( d2 < d1 ),重复1中的操作,进行排序。
- 直到d=1。
一般的,取d1=n/2,d2=d1/2,dk=dk-1/2,...直到d=1;
已知的最好步长串行是由Sedgewick提出的 (1, 5, 19, 41, 109,...)。
希尔排序是不稳定的。
1 void shellsort(int *data, size_t size) 2 { 3 for (int gap = size / 2; gap > 0; gap /= 2) 4 for (int i = gap; i < size; ++i) 5 { 6 7 int key = data[i]; 8 int j = 0; 9 for( j = i -gap; j >= 0 && data[j] > key; j -=gap) 10 { 11 data[j+gap] = data[j]; 12 } 13 data[j+gap] = key; 14 } 15 }