- 概念:
希尔排序法,又称缩小增量法。希尔排序法的基本思想是:先选定一个整数, 把待排序文件中所有数据分成几个组,所有距离为gap的数据分在同一组内,并对每一组内的数据进行排序。 然后,去重复上述分组和排序的工作。当到达gap=1时,所有数据在一组内排好序。
- 算法思想:
将待排序数组按照步长gap进行分组,然后对每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。
- 具体代码:
#include <stdio.h>
#include <stdlib.h>
void ShellSort(int* a, int n)//希尔排序
{
int gap = n;
while (gap > 1)
{
gap = gap / 3 + 1;
for (int i = 0; i < n - gap; i++)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0 && a[end]>tmp)
{
a[end + gap] = a[end];
end -= gap;
}
a[end + gap] = tmp;
}
}
}
void SortTest()
{
int a[10] = { 5, 2, 4, 6, 1, 3, 8, 7, 9,0 };
int sz = sizeof(a) / sizeof(a[0]);
printf("希尔排序:>");
ShellSort(a, sz);
PrintArray(a, sz);
}
int main()
{
SortTest();
system("pause");
return 0;
}
- 特性总结:
1.希尔排序是对直接插入排序的优化;
2.当gap> 1时都是预排序,目的是让数组更接近于有序。当gap== 1时,数组已经接近有序的了,这样就
会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比;
3.希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N^1.3- -N^2)
4.稳定性:不稳定
5.敏感性:对数据很敏感,如果数组已经接近有序,排序效率很高