希尔排序 -
插入排序的改进版。为了减少数据的移动次数,在初始序列较大时取较大的步长,通常取序列长度的一半,此时只有两个元素比较,交换一次;之后步长依次减半直至步长为1,即为插入排序,由于此时序列已接近有序,故插入元素时数据移动的次数会相对较少,效率得到了提高。
时间复杂度:通常认为是O(N3/2) ,未验证 稳定性:不稳定
/*希尔排序*/
2 void shellSort(vector<int> &arr, int bgn, int end)
3 {
4 for (int step = (end - bgn) / 2; step > 0; step /= 2)
5 {
6 for (int i = bgn; i < bgn + step; ++i)
7 {
8 /*
9 * 以下,insertSort的变异
10 */
11 for (int j = i + step; j < end; j += step)
12 {
13 int k = j - step;
14 for ( ; k >= i; k -= step)
15 if (arr[k] <= arr[j])
16 break;
17 if (k != j - step)
18 {
19 int tmp = arr[j];
20 for (int m = j; m > k + step; m -= step)
21 arr[m] = arr[m - step];
22 arr[k + step] = tmp;
23 }
24 }
25 }
26 }
27 }
来源:CSDN
作者:卧_听风雨
链接:https://blog.csdn.net/birenxiaofeigg/article/details/103458684