十大排序之希尔排序(C语言实现)(排序算法)

希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止.
时间复杂度O(n^(1.3—2))
空间复杂度O(1)
举个例子:
在这里插入图片描述

在这里我们要提出逆序对的相关问题,设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。
如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。
例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个。
所以像选择,排序,插入每次都是消去一个逆序对,所以执行的次数会比较高。
所以希尔排序就是一次我不只消掉一个逆序对,而是一次消掉多个逆序对,这样效率就高了。
执行代码如下

#include<stdio.h>
void xier_sort(int a[],int N);
int main()
{
	int a[10];
	int i;
	printf("请输入要排序的元素:\n");
	for(i=0;i<10;i++)
	scanf("%d",&a[i]);
	printf("未排序之前的元素顺序:\n");
	for(i=0;i<10;i++)
		printf("%2d",a[i]);
	charu_sort(a,10);
	printf("\n");
	printf("排序之后的元素顺序为:\n");
	for(i=0;i<10;i++)
		printf("%2d",a[i]);
	return 0;
}
void xier_sort(int a[],int N)//内层是插入排序
{
	int temp;
	for(int D=N/2;D>0;D/=2)/*希尔增量序列*/
	{
		for(int i=D;i<N;i++)
	{
		temp=a[i];
		for(int j=i;j>=D&&a[j-D]>temp;j-=D)
		{
			a[j]=a[j-D];
			a[j-D]=temp;
		}
	}
	}
}

运算结果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值