【排序】7.希尔排序

插入排序的一种,也叫缩小增量排序,是直接插入排序算法的改进版本,是一种分组插入方法

排序思路:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;

      随着增量的逐渐减少,每组关键字越来越多,当增量减到1时,文件恰好被分为一组,算法终止

希尔排序是基于插入排序的以下两点性质进行改进的

   插入排序在对几乎已经排好序的数据操作时,效率高

   一般来说是低效的,因为只能移动一位 

public static void shellsort(int[] a){
        if (a==null&&a.length==0) {
            return;
        }    
        int d=a.length;
        //算法效率排行: 移位 > 赋值 > 大小比较 > 加法 > 减法 > 乘法 > 取模 > 除法
        //不建议这么做
        /* 这是一个微优化,一般的优化器都可以做到。手动优化纯属得不偿失,甚至反而有可能损失性能。
         * 这个优化带来的效率提升是微乎其微的,甚至没有任何影响。在这里浪费时间还不如好好优化别的地方。
         * 代码的效率应该放到次要的位置(除非是性能瓶颈),良好的设计什么的才是更重要的选择。
         * 影响可读性。把 x = 5 * x + 1 写成 x += x << 2 + 1 的对读代码的人不友好*/
        while(d>=1){
            d=d>>1;//向低位移一位,当被除数大于0时,相当于除2,效率更高
            insertsort(a,d);  //子数组进行插入排序
        }
    }
public static void insertsort(int[] a,int d){//对子数组的排序可以替换为其他排序
        for (int i = 0; i < d; i++) {
            for (int j = i+d; j < a.length; j=j+d) {
                int temp=a[j];
                int k;
                for (k = j-d;k>=0&&a[k]<temp; k=k-d) {
                    a[k+d]=a[k];
                }
                a[k+d]=temp;
            }
        }
    }

希尔排序是一种不稳定的排序方法

希尔排序的时间复杂度与增量序列的选取有关

时间复杂度:希尔增量时间复杂度为O(n²)

       Hibbard增量的时间复杂度为O( )

空间复杂度:O(1)

希尔排序时间复杂度的下界是O(n*log2n),比快速排序要慢

中等规模的数据表现好,不适合太大规模的数据排序

 

posted @ 2017-10-22 15:45  chain155  阅读(100)  评论(0)    收藏  举报