希尔排序

Posted jpzhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了希尔排序相关的知识,希望对你有一定的参考价值。

概念

同直接插入排序,多段后移。也叫增量排序。

基本思想

先取一个小于n的数d1作为第一个增量,把文件的全部记录分组

所有距离为d1的倍数的记录放在同一个组中

现在各组内进行直接插入排序

然后取第二个增量d2<d1重复上述的分组和排序,直至所取得增量 = 1,即将所有的记录放在同一组中进行直接插入排序为止

 

实现代码

 1 void ShellSort(vector<int> &nums)
 2 {
 3     int len = nums.size();
 4     int increment = len;
 5     while (increment > 1)
 6     {
 7         increment = increment / 3 + 1;
 8         for (int i = increment; i < len; i++)
 9         {
10             int temp = nums[i];
11             if (nums[i] < nums[i - increment])//比较同组内的数据
12             {
13                 int j;
14                 for (j = i - increment; j >= 0 && nums[j] > temp; j = j - increment)
15                     nums[j + increment] = nums[j];
16                 nums[j + increment] = temp;
17             }
18         }
19     }
20 }

性能

最好:O(n)

最坏:O(n^2)

平均:不确定

空间复杂度:O(1)

稳定性:不稳定

 

以上是关于希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

希尔排序

插入排序(直接插入排序折半插入排序希尔排序的算法思想及代码实现)

希尔排序图解与代码

算法-java代码实现希尔排序

希尔排序JAVA代码

《算法》笔记 3 - 选择排序插入排序希尔排序