排序大法之希尔排序

希尔排序的基础为插入排序,首先理一下插入排序的思路:

插入排序核心代码思想:

void insert_sort(int a[],int n)
{
	int i,j;
	for(i = 1; i < n; i++)   // 从第二个元素开始标,进行n-1次循环
	{
		int tmp = a[i];  //将这个元素赋值给tmp
		for(j = i; j > 0 && a[j-1] > tmp; j--)  // 从这个元素开始向前比较,如果前面的元素大于tmp,则将前面的元素值赋给这个元素

		{
			a[j] = a[j-1];   
		}
		a[j] = tmp; tmp的值赋给前一个元素的值,其实就是交换元素的值
	}
}
希尔排序就是在插入排序基础上增加了一个增量序列,对于N个数据的数组,N个元素的序列,增量序列为N/2,N/2/2,......直到增量序列 = 1

每次循环,对每隔增量序列个元素进行插入排序,核心代码如下:

void shell_sort(int a[],int n)
{
	int d,p,i;
	for(d = n/2; d > 0; d = d/2)  // 增量序列每次取 n/2 
	{
		for(p = d; p < n; p++)
		{
			int tmp = a[p];
			for(i = p; i >= d && a[i-d] > tmp; i = i-d)  //对每隔d个元素的元素进行插入排序 
			{
				a[i] = a[i-d];   
			}
			a[i] = tmp;
		}
	}
}
希尔排序一次数据交换可能减少多个逆序对,从而提高效率,在某些情况下由于冒泡和插入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值