c/c++实现希尔排序

给你一囗甜甜゛ 提交于 2019-12-16 09:25:04

希尔排序 -

插入排序的改进版。为了减少数据的移动次数,在初始序列较大时取较大的步长,通常取序列长度的一半,此时只有两个元素比较,交换一次;之后步长依次减半直至步长为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 }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!