📂排序
🔖排序
2022-11-02 09:08阅读: 26评论: 0推荐: 0

希尔排序

希尔排序是对插入排序的改进
基于以下两点性质:

  1. 插入排序对于几乎已经排好序的数据操作时,效率高
  2. 但插入排序一般来说都是低效的,因为插入排序每次只能将数据移动一位

定义增量gap,即序列被分成gap组

注意这里的分组元素不是连续的
盗个图

对每组分别进行直接插入排序,然后缩小增量

它减少了比较并交换的次数

思想是:

  1. 先将待排序列分割为若干子序列分别进行直接插入排序
  2. 带整个序列“基本有序”时,再对整个序列进行直接插入排序

算法执行过程大概数,

  1. 首选确定一个初始增量gap
  2. 然后从gap位置向后操作,对于每一个元素
  3. 看他与同组前一个元素大小比较,如果小于就交换

那么问题来了,只往钱比,能确定后面就没有了吗?换句话说,能确定gap就是…
确实没法保证后面,但是它会遍历到后面的,找前面只相当于直接插入向前找位置的操作
而且gap+1能保证是各组第一个元素的后一个

template<typename T>
void shell_sort(vector<T>& nums) {
int n = nums.size(),h=1;
// 初始化细节
while (h < 3 / n) h = 3 * h + 1;
while (h >= 1) {
for (int i = h; i < n; i++)
// 改这里nums[j] < nums[j - h]大于小于就可以变为降序
for (int j = i; j - h >= 0 && nums[j] < nums[j - h]; j -= h)
swap(nums[j], nums[j - h]);
h /= 3;
}
}

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16848768.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(26)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起