本质上:希尔排序是gap>1时的预排序 + gap==1时的插入排序
特点:gap越大,大的数越快到后面,小的数越快到前面,越接近无序; gap越小,大的数越慢到后面,小的数越慢到前面,越接近有序。

(1).第一步--预排序(接近有序)
(2).第二步--直接插入排序(有序)
void ShellSort(int* a, int n)//针对数据量大的
{
- int gap = 3;
-
- //1.第一个for是表示第几组
- for (int j = 0; j < gap; ++j)为啥j
- 距,全部数是被分为gap组的,
- 同组中的数间隔gap.包括间隔
- 中的数和本身,就只有gap个
- {
-
- //2.第二个for表示第j组中的第几个
- for (int i = j; i < n - gap; i += gap)
- {
- int end = i;
- int tmp = a[end + gap];
- while (end >= 0)
- {
- if (tmp < a[end])
- {
- a[end + gap] = a[end];
- end -= gap;
- }
- else
- {
- break;
- }
- }
- a[end + gap] = tmp;
- }
- }
二、多趟的插入
1.法1 将每一组gap分开完成,先完成一组再完成另一组
//多趟的插入
// gap > 1时是预排序
// gap 最后一次等于1,是直接插入排序
- int gap = n;
- while (gap > 1)
- {
- gap = gap / 3 + 1;//官方规定的gap的缩减速度,当gap缩减到1时,则变为了插入排序
- for (int j = 0; j < gap; ++j)//先完成一个的,再完成另一个
- { 为啥j
- 距,全部数是被分为gap组的,
- 同组中的数间隔gap.包括间隔
- 中的数和本身,就只有gap个
-
- for (int i = j; i < n - gap; i += gap)//为啥i
- {
- int end = i;
- int tmp = a[end + gap];
- while (end >= 0)
- {
- if (tmp < a[end])
- {
- a[end + gap] = a[end];
- end -= gap;
- }
- else
- {
- break;
- }
- }
- a[end + gap] = tmp;
- }
- }
- }
疑问:
1.for (int j = 0; j < gap; ++j) 为啥j
2.for (int i = j; i < n - gap; i += gap)//为啥i
如int tmp = a[end + gap];
2.法2 所有gap组并发进行
//多趟的插入
// gap > 1时是预排序
// gap 最后一次等于1,是直接插入排序
- int gap = n;
- while (gap > 1)
- {
- gap = gap / 3 + 1;
-
- for (int i = 0; i < n - gap; ++i)//gap组数据交替插入排序(优化)
- {
- int end = i;
- int tmp = a[end + gap];
- while (end >= 0)
- {
- if (tmp < a[end])
- {
- a[end + gap] = a[end];
- end -= gap;
- }
- else
- {
- break;
- }
- }
- a[end + gap] = tmp;
- }
- }
}
图解:
-
相关阅读:
遗传算法!
怎样控制键盘按键自动填写网页表单
科技联众,互利共赢 | 卡驰科技(深圳)有限公司CEO张倍铭博士到访拓世科技集团,共探跨境电商,海外拓展无限可能
第十章、python字符串操作与with语句及上下文管理器------字符串的操作:字符串的匹配与查找
Go 存储系列:LSM存储引擎 LevelDB
将时间序列转成图像——马尔可夫转移场方法 Matlab实现
Fusion Compute网络虚拟化
linux开发环境下出现Segmentation fault问题排查一
设计模式- 建造者模式(Builder Pattern)结构|原理|优缺点|场景|示例
关于dubbo的rpc基于传输层一说
-
原文地址:https://blog.csdn.net/anyway33/article/details/126526085