• 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排序算法的中心在与找到增量,根据增量来找到两两需要比较和交换的值,最后再进行一次直接插入运算,这样就算是大功告成了。
           



  • 相关阅读:
    iOS
    H5
    MongoDB应用场景
    win10虚拟桌面;一不小心按错了突然只剩下桌面,启动的程序都没了
    Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能
    MongoDB模糊查询,以及MongoDB模糊查询时带有括号的情况
    对一个结果集(List)进行手动分页
    史上最污技术解读
    Java编译时多态和运行时多态
    MongoDB常用查询,排序,group,SpringDataMongoDB update group
  • 原文地址:https://www.cnblogs.com/zsswpb/p/5771632.html
Copyright © 2020-2023  润新知