zoukankan      html  css  js  c++  java
  • 希尔排序学习

    希尔排序的思想是分治法,以增量以某种方式递减的方法将待排序列分成几个的小序列,然后序列内进行直接插入排序。这个排序方法代码简洁易理解,如下:

    void ShellSort(int a[],int n)
    {
    	int d = n/2;//初始增量设为待排序列长度的一半
    	int temp,i,j;
    	while(d>=1)
    	{
    		for (i=d;i<n;i++)
    		{
    			if (a[i] < a[i-d])
    			{
    				temp = a[i];//暂存需要插入的记录
    				for (j=i-d;j>=0 && a[j] > a[i];j-=d)
    				{
    					a[j+d] = a[j]; //记录后移,查找插入位置
    				}
    				a[j+d] = temp;//插入
    			}
    		}
    		d = d/2;
    	}
    }
    

    时间复杂度分析:

    希尔排序的关键并不是随便分组后各自排序,而是将相隔某个“增量”的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高
    这里“增量”的选取就非常关键了。在《大话数据结构》中,伍老师是用increment= increment/3+1;的方式选取增量的,可究竟应该选取什么样的增量才是最好,目前还是一个数学难题,迄今为止还没有人找到一种最好的增量序列。不过大量的研究表明,当增量序列为dlta[k]=2t‐k+1‐1(0≤k≤t≤⌊log2(n+1)⌋)时,可以获得不错的效率,其时间复杂度为O(n的3/2次方),要好于直接排序的O(n平方)。需要注意的是,增量序列的最后一个增量值必须等于1才行。另外由于记录是跳跃式的移动,希尔排序并不是一种稳定的排序算法

    不管怎么说,希尔排序算法的发明,使得我们终于突破了慢速排序的时代(超越了时间复杂度为O(n平方)),之后,相应的更为高效的排序算法也就相继出现了。

  • 相关阅读:
    看大话设计模式读书笔记
    Android 混淆之proguard
    新手理解Navigator的教程
    Content Provider的权限
    INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
    Android HOME键那些事
    SwipeRefreshLayout 源码分析
    Android Bander设计与实现
    Android Studio 调试技巧
    SSDP 简单服务发现协议
  • 原文地址:https://www.cnblogs.com/stoneJin/p/2223991.html
Copyright © 2011-2022 走看看