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


一、動圖演示

 

 

二、思路分析

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

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

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

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

 

 

三、復雜度分析

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

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

2.  空間復雜度:希爾排序,只需要一個變量用於兩數交換,與n的大小無關,所以空間復雜度為:O(1)。

 

 

 四、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; } } } } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM