1.希尔排序内容( 缩小增量排序 )
希尔排序是利用直接插入排序的优点,进而改善所产生的一个排序算法。参见我的上一篇文章,直接插入排序的优点是当数据足够小且有序性高时,直接插入排序效率最高。希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成若n个组,所有距离相同的分在同一组内,并对每一组内的记录进行排序。然后,重复上述分组和排序的工作。当到达n=1时,所有记录在统一组内排好序。
2.图示说明
int gap = n/2
第一趟:将n个元素分为gap个组,每组 n/gap 个元素,
且两个元素间距相等为gap, 对每一组进行直接插入排序。
gap /= 2
第二趟: 继续将n个元素分为gap个组,且组间每两个元素间距相等为gap, 对每一组进行直接插入排序。
gap /= 2
第三趟: 继续n个元素分为gap个组,且组间每两个元素间距相等为gap, 对每一组进行直接插入排序。直至gap = 1,排序结束.
3、代码实现
#include<stdio.h>
void ShellSort(int *src,int n)
{
int gap;//组的间距
int k;//组内成员的个数
int i,j;
for(gap = n / 2;gap > 0;gap /= 2)
{
for(k = 0;k < gap;k ++)
{
for(i = gap + k;i< n ;i += gap )//每组成员之间的间距为gap
{
int tmp = src[i];
for(j = i;j >= gap && src[j-gap] > tmp ;j -= gap)
{
src[j] = src[j-gap];
}
src[j] = tmp;
}
}
}
}
void Print(int *src ,int n)
{
for(int i=0;i<n;i++)
{
printf("%d ",src[i]);
}
putchar('\n');
}
int main()
{
int src[]={3, 9, 10, 4, 6, 7 ,2, 8, 1 ,5};
int n = sizeof(src)/sizeof(src[0]);
ShellSort(src,n);
Print(src,n);
return 0 ;
}
4.希尔排序的特性总结:
- 希尔排序是对直接插入排序的优化。
- 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
- 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N1.3—N2)
- 稳定性:不稳定