让算法会说话之希尔排序

本文详细介绍了希尔排序算法,一种高效的插入排序改进版本,并通过实例演示了排序过程。文章提供了C语言实现代码,展示了不同步长下排序的变化。

转载请注明出处: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 著

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若云流风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值