希尔排序(shell sort)

希尔排序(改进的插入排序):

希尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行插入排序
排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。
但是: 希尔排序会改变相同元素的原先相对位置, 也就是说希尔排序是不稳定的。

原理: 通过较大的间距抽取元素进行排序,有效的减少逆序对 从而提高排序效率。

实现:

d 选取好坏会影响排序的效果 这里是d/2(并非好的选择)

void shell_sort(int a[], int n)
	{
		int i, j, d;
		int tmp;
		for(d = n/2; d > 0; d /= 2){ //最后 d 为 1 
			for(i = d; i < n; i++ ){//从d开始往后依此排 与当前元素相差d整数倍距离的元素
				tmp = a[i];
				for(j = i; j >= d && a[j-d] > tmp; j -= d){
					a[j] = a[j-d];
				}
				a[j] = tmp;
			}
		}
	}


改进的希尔排序:(使用Sedgewick增量序列)

void shell_sort(int a[], int n)
	{
		int i, j, d;
		int tmp;
		int Si;
		int Sedgewick[] = {929, 505, 209, 109, 41, 19, 5, 1, 0}; 
		for(Si = 0;  Sedgewick[Si] >= n; Si++ )//最大增量需要小于数组大小
		for(d = Sedgewick[Si]; d > 0; d = Sedgewick[++Si]){ //最后 d 为 1 
			for(i = d; i < n; i++ ){
				tmp = a[i];
				for(j = i; j >= d && a[j-d] > tmp; j -= d){
					a[j] = a[j-d];
				}
				a[j] = tmp;
			}
		}
	}

改进后的希尔排序 时间复杂度 平均可以为 O(N^(7/6))


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值