实时:希尔排序
时间:2023-03-30 21:14:31 来源:博客园
(资料图片)
希尔排序
欢迎关注fish的公众号:fish码农成长之旅
希尔排序也叫做递减增量排序算法,他是插入排序的高效改进版本。基本思想是将待排序的序列分成若干子序列分别进行插入排序,然后待整个序列基本有序的时候,再对整个序列排序。直观上看就是把数列进行分组(不停使用插入排序),直至从宏观上看起来有序,最后插入排序起来就容易了(无须多次移位或交换)。
算法步骤
首先我们选择一个增量序列,就是选择相隔多少位数为一个子序列,每次增量序列全部插入排序完之后,增量减少直到为1;gap1, gap2, gap3 ... gapk = 1。
按照我们的增量序列个数进行排序k次,每一次依据增量大小将整个序列分割成若干长度为m的子序列分别进行插入排序。
一次排序完成,增量减少,当增量为1时,整个序列作为一个表。
实例演示
总共7个数的排序,按照从小到大排序,原始数据为:3 38 5 1 9 4 10
首先第一次排序,按照gap=4将序列分为四组,每组元素在原来的索引上按照插入排序进行排序完成。第二次排序gap=2将序列分为两组,依旧在原来的索引按照插入排序进行。第三次gap=1,整个序列就相当于作一次插入排序。
代码实现
template void shell_sort(std::vector &arrs) { int n = arrs.size(); // 数组的大小 if (n <= 1) { // 一个数的情况不需要排序 return; } int gap = (n + 1) / 2; // 首先按照俩个一组分个序列 while (gap >= 1) { for (int idx_i = gap; idx_i < n; ++idx_i) { // 这里跟直接插入排序的区别就是每次idx_j要减去gap才能保证是对一个组的元素进行插入排序 for (int idx_j = idx_i; idx_j >= gap && arrs[idx_j] < arrs[idx_j - gap]; idx_j -= gap) { std::swap(arrs[idx_j], arrs[idx_j - gap]); } } gap /= 2; }}
标签:
最新文章推荐
- 陕西7名核酸检测阳性外省游客活动轨迹公布
- 万人说新疆 | 棉花朵朵赛白云,阿克苏美出新高度!
- 万人说新疆 | 孙芳红:我在新疆每天过得很充实也很快乐
- 万人说新疆 | 棉农阿卜来提开心地笑了
- 万人说新疆 | 阿迪力的棉花合作社年入300万
- 四川乐山犍为县发生4.3级地震 无人员伤亡
- 西安全面开展排查管控 目前20481人核酸检测结果均阴性
- 陕西7名核检阳性者为一旅行团同行人员 活动轨迹公布
- 西安交大举行2021级本科生迎新会 校长:学习是主动作为之事
- 【母亲河畔的中国】黄河岸边的这个村庄如何打好旅游服务牌?
资讯中心

2022-08-29

2022-06-20

2021-10-18

2021-10-18
热点资讯
-
1
实时:希尔排序
-
2
天天观速讯丨自称不偏不倚,却为TT播一首《好日子》,乌兹:我真的在支持RNG
-
3
环球观焦点:郑氏点银:黄金窄幅区间反复洗盘整理,拉低仍坚守看涨
-
4
每日信息:“间谍”,美媒一记者在俄被捕
-
5
天天速讯:2023南通黄山纪念币预约网点在哪里?(附地址)
-
6
天天快看:2023年3月30日LME锡库存报2480吨
-
7
世界看点:温州市本级第五批人才房明天配售,这些需要关注……
-
8
世界简讯:跨境电商+直销 加拿大佰傲莱公司开始布局亚洲市场
-
9
消息!这车真不错|新的更强?旧的更好?我选择了新款宝马325i
-
10
【世界快播报】2023广东省监狱管理局考试录用公务员体能测评公告
-
11
今热点:国风新材公布2022年度分配预案:拟10派0.2元(含税)
-
12
【环球快播报】光遇2023愚人节任务怎么完成-2023愚人节任务详解
-
13
世界今日报丨数实融合成经济增长新赛道
-
14
天天滚动:山东艺术类统考专业类别将缩减至6个
-
15
当前动态:雎字怎么读_雎字的含义
-
16
全球速读:图说|该如何避免电动车火灾
-
17
滚动:ie浏览器证书下载_ie证书下载
-
18
环球热推荐:王导:黄金1964多保本损,继续看涨不变
-
19
环球观天下!杭州二批次土拍滨江集团、绿城又是大赢家,中海、华发如愿“中签”
-
20
天天快报!良种如何成为良品?联合国粮农组织官员博鳌分享经验