本质上:希尔排序是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;
- }
- }
}
图解:
-
相关阅读:
手部骨骼跟踪能力,打造控制虚拟世界的手势密码
tsconfig编译属性isolatedModules的作用
MySQL基本操作之创建数据库
Day03 计算机信息的存储
再谈Java泛型
“拨”取数字的典例:N位水仙花数判断及水仙花数变种
bp神经网络对数据的要求,bp神经网络参数有哪些
Unity3D 常用得内置函数(Cg与GLSL)详解
智慧化转型赋能园区创新:科技创新引领产业智慧化,打造高效发展新格局
[技术发展-22]:网络与通信技术的应用与发展快速概览-2- 通信技术
-
原文地址:https://blog.csdn.net/anyway33/article/details/126526085