1. 程式人生 > >Java實現希爾排序(思路與實現)

Java實現希爾排序(思路與實現)

希爾排序

希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因DL.Shell於1959年提出而得名。 希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止。

希爾排序過程

希爾排序的基本思想是:將陣列列在一個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列(步長更長了,列數更少了)來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身還是使用陣列進行排序。

例如,假設有這樣一組數[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我們以步長為5開始進行排序,我們可以通過將這列表放在有5列的表中來更好地描述演算法,這樣他們就應該看起來是這樣(豎著的元素是步長組成):

  1. 13 14 94 33 82
  2. 25 59 94 65 23
  3. 45 27 73 25 39
  4. 10

然後我們對每列進行排序:

  1. 10 14 73 25 23
  2. 13 27 94 33 39
  3. 25 59 94 65 82
  4. 45

將上述四行數字,依序接在一起時我們得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]。這時10已經移至正確位置了,然後再以3為步長進行排序:

  1. 10 14 73
  2. 25 23 13
  3. 27 94 33
  4. 39 25 59
  5. 94 65 82
  6. 45

排序之後變為:

  1. 10 14 13
  2. 25 23 33
  3. 27 25 59
  4. 39 65 73
  5. 45 94 82
  6. 94

最後以1步長進行排序(此時就是簡單的插入排序了)

希爾排序的分析

  1. public class Shell
  2. {
  3. public static void main(String[] args)
  4. {
  5. int[] ins = {2,3,5,1,23,6,78,34,23,4,5,78,34,65,32,65,76,32,76,1,9};
  6. int[] ins2 = sort(ins);
  7. for(int in: ins2){
  8. System.out.println(in);
  9. }
  10. }
  11. public static int[] sort(int[] ins){
  12. int n = ins.length;
  13. int gap = n/2;
  14. while(gap > 0){
  15. for(int j = gap; j < n; j++){
  16. int i=j;
  17. while(i >= gap && ins[i-gap] > ins[i]){
  18. int temp = ins[i-gap]+ins[i];
  19. ins[i-gap] = temp-ins[i-gap];
  20. ins[i] = temp-ins[i-gap];
  21. i -= gap;
  22. }
  23. }
  24. gap = gap/2;
  25. }
  26. return ins;
  27. }
  28. }
  • 最優時間複雜度:根據步長序列的不同而不同
  • 最壞時間複雜度:O(n2)
  • 穩定想:不穩定