希尔排列——(王祎)

简单来说希尔排列是对插入排序的扩展,主要可以优化时间【从O(n^2)优化到最多O(nlog^2n)】采取的方法是分组排序,然后将基本成型的数据一次性排列搞定。

先讲插入排序


1.      设数组为a[0…n-1]。

{49, 38, 65, 97, 26, 13, 27, 49, 55, 4}

2.      初始时,a[0]自成1个有序区,无序区为a[1..n-1]。

{49|38, 65, 97, 26, 13, 27, 49, 55, 4}

3.      令i=1,将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。

{38,49|65, 97, 26, 13, 27, 49, 55, 4}

4.      i++并重复第二步直到i==n-1。排序完成。

{ 38,49,65|97,26,13, 27, 49, 55, 4 }

{38,49,65,97|26,13, 27, 49, 55, 4}

{26,38,49,65,97|13, 27, 49, 55, 4}

{13,26,38,49,65,97| 27, 49, 55, 4}

{13,26,27,38,49,65,97|  49, 55, 4}

{13,26,27,38,49,49,65,97|   55, 4}

{13,26,27,38,49,49,55,65,97|    4}

{4,13,26,27,38,49,49,55,65,97|   }

注意竖线位置,易得插入排序代码:

  void Insertsort3(int a[], int n)
{
	int i, j;
	for (i = 1; i < n; i++)
		for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)
			Swap(a[j], a[j + 1]);
}

  插入排序的效率在某些时候是很高的,比如,记录本身就是基本有序的,我们只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效。还有就是记录数比较少时,直接插入的优势也比较明显。

现在的问题是对于凌乱的数据我们怎么搞?分组!排成基本有序,再插入排序。怎么分组?才能使多次排序后基本有序?脑洞一开联想到简单抽样,是不是隔一段距离选一个点比较好?仍以{49, 38, 65, 97, 26, 13, 27, 49, 55, 4}(共10个数)做例子。演算还是最容易懂的……

第一步,雀氏纸尿裤。

第二步,{49, 38, 65, 97, 26, 13, 27, 49, 55, 4},注意看数字字号大小,相同为一组。我们采用距离间隔为10/2=5。

即分成{49,13}{38, 27}{65,49}{97, 55}{26,4}五组。分别使用插入排序然后扔回原数组,得

{13, 27, 49, 55449386597,26}        这一步看明白了么?

第三步,对于{13, 27, 49, 55449386597,26}  我们采用距离间隔为5/2=2。{13, 27, 49, 55449386597,26

即分成{13,49,4,38,97}{27,55,49,65,26}两组。分别使用插入排序然后扔回原数组,得
      {4   26   13   27   38    49   49   55   97   65}

第四步,现在终于基本有序了,直接用插入整体排一次就好,得结果。{4,13,26,27,38,49,49,55,65,97}

给你找了一个演示课件点击打开链接

代码:

void shellsort3(int a[], int n)
{
	int i, j, gap;

	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)
				Swap(a[j], a[j + gap]);
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值