Java常見排序演算法詳解——希爾排序
概念:
希爾排序通過將比較的全部元素分為幾個區域來提升插入排序的效能。這樣可以讓一個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的資料幾乎是已排好的了(此時插入排序較快)。
希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
- 插入排序在對幾乎已經排好序的資料操作時, 效率高, 即可以達到線性排序的效率
- 但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位
原理:
- 先取一個正整數 d1(d1 < n),把全部記錄分成 d1 個組,所有距離為 d1 的倍數的記錄看成一組,然後在各組內進行插入排序
- 然後取 d2(d2 < d1)
重複上述分組和排序操作;直到取 di = 1(i >= 1) 位置,即所有記錄成為一個組, - 最後對這個組進行插入排序。一般選 d1 約為 n/2,d2 為 d1 /2, d3 為 d2/2 ,…, di = 1。
列如:我們有一個數組[ 13 14 94 33 82 25 59 94 65 23 45 27 73如果我們以步長為5開始進行排序,我們可以通過將這列表放在有5列
然後我們對每列進行排序
我們可以看到通過第一趟之後,我們得到的陣列是:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]之後,我們再以3為步長進行排序:
排序之後:
最後再以1位步長進行排序,這時候就是個一個簡單的插入排序了。
實現程式碼:
publicvoid sort() { int number = array.length / 2; int i; int j; int temp; while (number >= 1) { for (i = number; i < array.length; i++) { temp = array[i]; j = i - number; while (j >= 0 && array[j] > temp) { //需要注意的是,這裡array[j] > temp將會使陣列從小到到排序。 array[j + number] = array[j]; j = j - number; } array[j + number] = temp; } number = number / 2; } }
算法系列:
完整程式碼:
Java和Kotlin程式碼我均放在了GitHub上,歡迎Star!
GitHub地址: https://github.com/yang0range/MyAlgorithm
歡迎關注公共號
關注公共號會有更多收穫!

掃一掃,據說年輕、優秀、顏值高的網際網路人都在這個群裡
