Java排序算法之——希爾排序

算法簡述

希爾排序也叫做shell排序或縮小增量排序,聽說是一個叫D.L.Shell的人發明出來的,顧取名shell排序。這種排序是基於插入排序思想的,也比較適用於數據量大時。算法


我剛開始看到時候對於插入排序也是半瓶子醋,直接致使我看不懂了,抓狂,so...我就去默默的補習一下插入排序嘍。shell

插入排序簡介

插入排序的核心思想是比較和插入,就是從第二個數開始,依次插入到前面合適的位置。排序步驟以下:數組

1. 首先對數組的前兩個數據進行從小到大的排序
2. 接着將第3個數據與排序好的兩個數據進行比較,插入合適的位置
3. 而後,將第4個數據插入已經排好的前3個數據中
4. 不斷重複上述的過程,完成排序

代碼實現

private void insertSort(int[] a)
    {
        int i,j,t,h;
        for(i =1;i<a.length;i++)
        {
            t = a[i];
            j = i-1;
            while(j>=0&&t<a[j])
            {
                a[j+1] = a[j];
                j--;
            }
            a[j+1] = t;
            System.out.println("第"+i+"步排序:"+Arrays.toString(a));
        }
    }

簡單的介紹了一下插入排序,下面就講一下這個希爾排序。code

排序步驟

1.將有n個元素的數組分爲n/2個數字序列,第1個數據和第n/2+1個數據爲一對。。。
2.一次循環使每個序列對排好順序(對每一個序列使用插入排序算法,實質是一種分組插入)
3.而後,再變爲n/4個序列,再次排序
4.不斷重複上述過程,隨着序列減小最後變爲一個,也就完成了整個排序。

實例講解

好比對{12,31,11,20,17,30}進行希爾排序:排序

1. 第一次排序,首先將數組分爲6/2=3個數字序列,第一個數據12和第四個數據20爲一對,第二個數據和第五個數據爲一對,第三個數據和第六個數據爲一對,每一對進行排序後數據爲:12,17,11,20,31,30
2. 第二次排序,將數組劃分爲6/4=1(這裏取整),此時逐個對數據比較,按照插入排序算法進行排序,排序後的數據爲:11,12,17,20,30,31

代碼片斷

private void shellSort(int[] a)
    {
        int i,j,h;
        int r,temp;
        int x = 0;
        for(r = a.length/2;r>=1;r/=2)
        {
            for(i = r;i<a.length;i++)
            {
                temp = a[i];
                j = i -r;
                while(j>=0&&temp<a[j])
                {
                    a[j+r] = a[j];
                    j-=r;
                }
                a[j+r] = temp;
            }
            x++;
            System.out.println("第"+x+"步排序:"+Arrays.toString(a));
        }
    }

至此希爾排序就完成了,時間複雜度爲O(nlog2n).循環

相關文章
相關標籤/搜索