希尔排序(C语言版)

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.希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就 会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  3. 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N1.3—N2)
  4. 稳定性:不稳定
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值