Java實現希爾排序(思路與實現)
阿新 • • 發佈:2018-12-23
希爾排序
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因DL.Shell於1959年提出而得名。 希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止。
希爾排序過程
希爾排序的基本思想是:將陣列列在一個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列(步長更長了,列數更少了)來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身還是使用陣列進行排序。
例如,假設有這樣一組數[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我們以步長為5開始進行排序,我們可以通過將這列表放在有5列的表中來更好地描述演算法,這樣他們就應該看起來是這樣(豎著的元素是步長組成):
- 13 14 94 33 82
- 25 59 94 65 23
- 45 27 73 25 39
- 10
然後我們對每列進行排序:
- 10 14 73 25 23
- 13 27 94 33 39
- 25 59 94 65 82
- 45
將上述四行數字,依序接在一起時我們得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]。這時10已經移至正確位置了,然後再以3為步長進行排序:
- 10 14 73
- 25 23 13
- 27 94 33
- 39 25 59
- 94 65 82
- 45
排序之後變為:
- 10 14 13
- 25 23 33
- 27 25 59
- 39 65 73
- 45 94 82
- 94
最後以1步長進行排序(此時就是簡單的插入排序了)
希爾排序的分析
- public class Shell
- {
- public static void main(String[] args)
- {
- int[] ins = {2,3,5,1,23,6,78,34,23,4,5,78,34,65,32,65,76,32,76,1,9};
- int[] ins2 = sort(ins);
- for(int in: ins2){
- System.out.println(in);
- }
- }
- public static int[] sort(int[] ins){
- int n = ins.length;
- int gap = n/2;
- while(gap > 0){
- for(int j = gap; j < n; j++){
- int i=j;
- while(i >= gap && ins[i-gap] > ins[i]){
- int temp = ins[i-gap]+ins[i];
- ins[i-gap] = temp-ins[i-gap];
- ins[i] = temp-ins[i-gap];
- i -= gap;
- }
- }
- gap = gap/2;
- }
- return ins;
- }
- }
- 最優時間複雜度:根據步長序列的不同而不同
- 最壞時間複雜度:O(n2)
- 穩定想:不穩定