希爾排序(Shell Sort)——插入排序法(Java實現)
阿新 • • 發佈:2018-12-24
希爾排序法(Shell Sort)屬於插入類排序,又稱為縮小增量排序。它對直接插入排序有了很大的改進,是直接插入排序的增強版。
希爾排序的基本思想是:
把線性表按步長gap分組,共有gap個組。
每組線性表中有arr.length/gap個元素,每個元素相鄰gap。接下來對每組線性表採用直接插入排序方法進行排序。
隨著步長逐漸減小,所分成的組包含的元素越來越多,當步長的值減小到 1 時,整個資料合成為一組,構成一組有序記錄,則完成排序。
下圖是本人對希爾排序思想所做的圖示:
步長gap的選擇決定著希爾排序的最終效率。只要最終步長為1任何步長序列都可以工作(且步長要小於陣列長度)。演算法最開始以一定的步長進行排序。隨著步長gap的逐漸減小,繼續以一定步長進行排序,最終演算法以步長為1進行排序。當步長為1時,演算法變為插入排序,這就保證了資料一定會被排序。
希爾排序的時間複雜度,與步長的關係如下圖:
java程式碼如下:
public class ShellSort { public static void main(String[] args) { // TODO 自動生成的方法存根 int arr[] = {4,9,2,3,5,10,8,6,1}; shellsort(arr); for(int a : arr) System.out.print(a+" "); } public static void shellsort(int arr[]){ //逐漸縮小步長。此處gap以每次除以2進行減少 for(int gap = arr.length/2 ; gap >=1 ; gap /= 2){ //gap為步長 //直接排序法 for(int i = gap ; i < arr.length ; i++){ int temp = arr[i]; while( i-gap >= 0 && arr[i-gap] > temp){ arr[i] = arr[i-gap]; i = i-gap; } arr[i] = temp; } } } }