一、简介
基本思想:
将待排序的数据元素分成若干个小组,对同一个小组内的数据元素用直接插入法排序;小组的个数逐次减少;当完成了所有数据元素都在一个组内的排序后,排序过程结束。希尔排序又叫缩小增量排序。
二、复杂度情况
复杂度和稳定性情况:
- 最好的时间复杂度:O(nlog²n)
- 最坏的时间复杂度:O(nlog²n)
- 平均的时间复杂度:O(nlogn)
- 空间复杂度:O(1)
- 稳定性:不稳定
三、实例说明
以n=8的一个数组 {6, 5, 3, 1, 8, 7, 2, 4} 为例
第一次 gap = 8 / 2 = 4(gap为增量)
- 将1A和1B对应的数比较,并排序
- 将2A和2B对应的数比较,并排序
- 将3A和3B对应的数比较,并排序
- 将4A和4B对应的数比较,并排序
6 5 3 1 8 7 2 4
1A 1B
2A 2B
3A 3B
4A 4B
第一次排序后:6 5 2 1 8 7 3 4
第二次 gap = 4 / 2 = 2(gap为增量)
注:默认小的放在左边,假如有交换,还得将目前较大的这个值和左边同组的元素依次比较并排序(直接插入排序的思想)
- 将1B和1A对应的数比较,并排序
- 将2B和2A对应的数比较,并排序
- 将1C和1B对应的数比较,并排序
- 将2C和2B对应的数比较,并排序
- 将1D和1C对应的数比较,并排序
- 将2D和2C对应的数比较,并排序
6 5 2 1 8 7 3 4
1A 1B 1C 1D
2A 2B 2C 2D
第二次排序后:2 1 3 4 6 5 8 7
第三次 gap = 2 / 2 = 1(gap为增量)
注:默认小的放在左边,假如有交换,还得将目前较大的这个值和左边同组的元素依次比较并排序(直接插入排序的思想)
- 将1B和1A对应的数比较,并排序
- 将1C和1B对应的数比较,并排序
- 将1D和1C对应的数比较,并排序
- 将1E和1D对应的数比较,并排序
- 将1F和1E对应的数比较,并排序
- 将1G和1F对应的数比较,并排序
- 将1H和1G对应的数比较,并排序
2 1 3 4 6 5 8 7
1A 1B 1C 1D 1E 1F 1G 1H
第三次排序后:1 2 3 4 5 6 7 8
四、代码实现
C++实现代码如下:
#include<iostream>
using namespace std;
void ShellSort(int a[], int n)
{
int gap, tmp, j; // gap为增量
gap = n / 2;
while (gap != 0)
{
for (int i = gap; i < n; ++i)
{
tmp = a[i];
j = i - gap;
while (tmp < a[j] && j >= 0) // 插入排序法
{
a[j+gap] = a[j];
j -= gap;
}
a[j+gap] = tmp;
}
gap /= 2;
}
}
int main()
{
int arr[] = {6, 5, 3, 1, 8, 7, 2, 4};
int n = sizeof(arr) / sizeof(arr[0]);
ShellSort(arr,n);
for(int i = 0; i < n; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
其他排序算法:
ok,今天分享就到这里了。
如果觉得分享对你有所帮助的话,记得点赞哦!
主页还有其他相关文章,欢迎一起学习,一起进步~