原始地址: C / C++算法学习笔记(8)-SHELL排序
基本思想
先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<;…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
算法编码
void shellSort(int v[], int n) { int gap, i, j, temp; for(gap = n / 2;gap > 0;gap /= 2) //设定步长 { for(i = gap;i < n;++i) //在元素间移动为止 { for(j = i-gap; j >= 0&&v[j] > v[j+gap]; j -= gap) { //比较相距gap的元素,逆序互换 temp = v[j]; v[j] = v[j+gap]; v[j+gap] = temp; } } } }
1.首先设定gap = n/2 = 4于是分组
32,34 -> 32,34
43, 8 -> 8, 43
56,54 -> 54,56
99,76 -> 76,99
数列变成 32,8,54,76,34,43,56,99
2.gap = gap/2 = 2 于是分组
32,54,34,56 -> 32,34,54,56
8,76,43,99 -> 8,43,76,99
于是数列变成 32,8,34,43,54,76,56,99
3.gap = gap/2 = 1于是分组
32,8,34,43,54,76,56,99
->
8,32,34,43,54,56,76,99
gap=1结束……