转载请注明出处:http://blog.youkuaiyun.com/ruoyunliufeng/article/details/26137627
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1.插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率。
2.但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位。
一.插入排序算法
/***************************************************************
*版权所有 (C)2014,公司名称。
*
*文件名称:希尔排序法
*内容摘要:无
*其它说明:无
*当前版本:V1.0
*作 者:若云流风
*完成日期:2014.5.18
***************************************************************/
#include <stdio.h>
#define N 8
void disp(void);
int a[N]={8,7,6,5,4,3,2,1};
/*排序函数*/
void shellsort(void)
{
int i, j, gap,temp;
for (gap = N / 2; gap > 0; gap /= 2)
{
for (i = gap; i < N; i++)
{
for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)
{
temp=a[j+gap];
a[j+gap]=a[j];
a[j]=temp;
printf("\n比较 ");
}
disp();
}
printf("\n\n");
}
}
/*输出函数*/
void disp(void)
{
int i;
printf("\n排序结果: \n");
for(i=0;i<N;i++)
{
printf("%d", a[i]);
printf(" ");
}
}
int main(void)
{
shellsort();
// disp();
return 0;
}
二.算法会说话
1.结果输出
2.结果分析
现在我来分析希尔排序为步长为2的时候,整个程序的运行,向大家展示希尔算法。
1.输出结果:正如第六行所看到的,单数和双数都被正确排序(步长为2)。
2.运行过程:1.3.5和2.4.6分别可以看成是两次插入排序过程。
上图的“比较”两个字代表有数据交换,上图清晰的表明的希尔排序的整个过程。我为了清晰展示算法选用了逆序的数字1到8。在最后步长为1的时候,程序即变成了上一篇我写的插入排序。现在我把int a[N]={2,1,4,3,6,5,8,7};用上一篇的代码进行测试。让小伙伴们看看一不一样。
注意希尔增量的选取不同会使得算法的效率不同(我选的这个也不一定是最高的),这也使得希尔排序是非稳定排序算法。
参考:1.维基百科
2.数据结构与算法分析---C语言描述 Mark Allen Weiss 著