好程式設計師Java學習路線帶你5分鐘瞭解希爾排序

好程式設計師IT發表於2019-07-18

好程式設計師Java學習路線帶你5分鐘瞭解希爾排序,前言:希爾排序(shell sort)是插入排序的一種,它是簡單插入排序經過改進之後的一個更高效的演算法,這個排序方法又稱為縮小增量排序。

希爾排序思想介紹

簡單來說,希爾排序是將較大的資料集合邏輯上分割成若干個小的集合,然後對每個分組分別進行插入排序。

例如,假設待排序元素序列有n個元素,首先取一個整數increment(小於n)作為間隔將全部元素分為increment個子序列,在每一個子序列中分別實行直接插入排序。然後縮小間隔increment,重複上述子序列劃分和排序工作。直到最後取increment=1,將所有元素放在同一個子序列中排序為止。

演算法說明:

待排序資料:12,1,6,7,4,10,5,9

第一次的增量為陣列元素的長度/2,即increment=4,得到四個分組:

分組一:12,             4

分組二:      1,              10

分組三:          6,                  5

分組四:             7,                    9

對這四個分組分別進行插入排序,最終得到:

4,1,5,7,12,10,6,9

第二次比較,increment取上次值的一半,即increment=2,得到兩個分組:

分組一:4,  5,  12, 6

分組二:    1, 7,  10, 9

對這兩個分組分別進行插入排序,最終得到:

4, 1, 5,7, 6,9,12,10

第三次比較,increment=1,即只有一個分組:

分組一:4,1,5,7,6,9,12,10

   對其進行插入排序,最終得到:

1,4,5,6,7,9,10,12

希爾排序的程式碼實現

1.  public   static   void  shellSort( int [] arr){  

2.      int  temp = 0;  

3.      int  j = 0;  

4.     //增量初始值是長度的一半,增量每次變為原來的一半  

5.      for ( int  inc = arr.length/2 ; inc >= 1 ; inc /= 2){  

6.          for ( int  i = inc ; i < arr.length; i++){  

7.             temp = arr ;  

8.             //將當前數與減去增量之後位置的數進行比較,如果大於,則後移  

9.              for (j = i - inc; j >=0; j -= inc){  

10.                  if (arr[j] > temp){  

11.                     arr[j + inc] = arr[j];  

12.                 } else {  

13.                      break ;  

14.                 }  

15.             }  

16.             arr[j + inc]=temp;  

17.         }  

18.     }  

19. }  

總結

希爾排序是插入排序的改進,但是希爾排序中使用到了多次插入排序,在不同的插入排序過程中,相同的元素在各自的插入排序中可能會移動,造成排序的穩定性被打亂,所以希爾排序是不穩定的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2651044/,如需轉載,請註明出處,否則將追究法律責任。

相關文章