zoukankan      html  css  js  c++  java
  • Shell排序——软考(五)

         希尔排序是一种插入排序,是对直接插入排序的一种改进,该算法出自于D.L.Shell,因此得名为希尔。Shell排序又名缩小增量排序。

    思想

         假设初始序列为n个元素,先取一个小于n的整数d1作为第一个增量,然后将全部元素分为d1组。所有距离为d1的倍数的记录放在同一个组中,先在各个组内进行直接插入排序,然后取第二个增量d2 < d1(d2=d1/2)重复上述的分组和排序动作,直到所取的增量di=1,即所有记录放在同一组中进行直接插入排序为止。 
         注意:一般去d1=n/2,di+1=di/2。如果结果为偶数,则加1,保证di为奇数。

    例子

        初始序列为[ 6 3 4 1 5 8]
        第一步: 
             d1=6/2=3,将第一个和第四个比较,进行交换,如图所示。
             
         第二步:
             d2=d1/2=1.5,由于取奇数,所以d2=1;
             
             此时待排序列仍是无序的。
         第三步:
             当执行到d=1时,仍然是无序的,此时进行直接插入排序,直接插入排序不再详细叙述,请看上一篇博客:
     这样希尔排序才是真正的完成。
    代码
    void shellsort(int number[]) {   
        int i, j, k, d, t;   
      
        d = Len / 2;   
      
        while(d > 0) {   
            for(k = 0; k < d; k++) {   
                for(i = k+d; i < Len; i+=gap) {   
                    for(j = i - d; j >= k; j-=d) {   
                        if(number[j] > number[j+d]) {   
                            t = number[j];
                            number[j]=number[j+d];
                            number[j+d]=t;  
                        }   
                        else   
                            break;   
                    }   
                }   
            } 
        }

    分析
         由上面的例子可以看出,希尔排序的执行时间依赖于增量序列d的选择,由于增量不确定,所以希尔排序是不稳定的排序。其平均时间复杂度是  O(n1.3),最坏情况时间复杂度为 O(n2);空间复杂度为O(1)。
    总结:
         经过上述分析之后发现shell排序算法的中心在与找到增量,根据增量来找到两两需要比较和交换的值,最后再进行一次直接插入运算,这样就算是大功告成了。
           



  • 相关阅读:
    swoole 安装方法 使用即时聊天
    git的介绍以及简单应用
    curl的应用
    linux下监听和同步代码配置
    mac skim 修改背景色
    php 编译安装的一个 configure 配置
    mac mysql error You must reset your password using ALTER USER statement before executing this statement.
    yii2 控制器里 action 大小写组合造成的路由问题
    warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
    redis 自启动脚本
  • 原文地址:https://www.cnblogs.com/zsswpb/p/5771632.html
Copyright © 2011-2022 走看看