八大排序算法——希爾(shell)排序(動圖演示 思路分析 實例代碼java 複雜度分析)

1、動圖演示java

 

 

2、思路分析算法

希爾排序是把記錄按下標的必定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減小,每組包含的關鍵詞愈來愈多,當增量減至1時,整個文件恰被分紅一組,算法便終止。shell

  簡單插入排序很循規蹈矩,無論數組分佈是怎麼樣的,依然一步一步的對元素進行比較,移動,插入,好比[5,4,3,2,1,0]這種倒序序列,數組末端的0要回到首位置非常費勁,比較和移動元素均需n-1次。數組

  而希爾排序在數組中採用跳躍式分組的策略,經過某個增量將數組元素劃分爲若干組,而後分組進行插入排序,隨後逐步縮小增量,繼續按組進行插入排序操做,直至增量爲1。希爾排序經過這種策略使得整個數組在初始階段達到從宏觀上看基本有序,小的基本在前,大的基本在後。而後縮小增量,到增量爲1時,其實多數狀況下只需微調便可,不會涉及過多的數據移動。spa

  來看下希爾排序的基本步驟,在此選擇增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇能夠用一個序列來表示,{n/2,(n/2)/2...1},稱爲增量序列。希爾排序的增量序列的選擇與證實是個數學難題,選擇的這個增量序列是比較經常使用的,也是希爾建議的增量,稱爲希爾增量,但其實這個增量序列不是最優的。此處作示例使用希爾增量。code

 

 

3、複雜度分析blog

1.  時間複雜度:最壞狀況下,每兩個數都要比較並交換一次,則最壞狀況下的時間複雜度爲O(n2, 最好狀況下,數組是有序的,不須要交換,只須要比較,則最好狀況下的時間複雜度爲O(n)。排序

經大量人研究,希爾排序的平均時間複雜度爲O(n1.3(這個我也不知道咋來的,書上和博客上都這樣說,也沒找到個具體的依據,,,)。博客

2.  空間複雜度:希爾排序,只須要一個變量用於兩數交換,與n的大小無關,因此空間複雜度爲:O(1)。數學

 

 

 4、Java 代碼以下

import java.util.Arrays; public class shell { public static void main(String[] args) { int[] arr = new int[]{10,6,3,8,33,27,66,9,7,88}; shellSort(arr); System.out.println(Arrays.toString(arr)); } private static void shellSort(int[] arr) { int temp; //控制增量序列,增量序列爲1的時候爲最後一趟
        for (int i = arr.length/2; i >0; i/=2) { //根據增量序列,找到每組比較序列的最後一個數的位置
            for (int j = i; j < arr.length; j++) { //根據該比較序列的最後一個數的位置,依次向前執行插入排序
                for (int k = j-i; k >=0; k-=i) { if(arr[k]>arr[k+i]){ temp = arr[k]; arr[k] = arr[k+i]; arr[k+i] = temp; } } } } } }
相關文章
相關標籤/搜索