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

希爾排序實現(Java)

希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。

該方法的基本思想是:
1、把記錄按步長 gap 分組,對每組記錄採用直接插入排序方法進行排序。
2、隨著步長逐漸減小,所分成的組包含的記錄越來越多,當步長的值減小到 1 時,整個資料合成為一組,構成一組有序記錄,則完成排序。

這裡寫圖片描述

在上面這幅圖中:

初始時,有一個大小為 10 的無序序列。

在第一趟排序中,我們不妨設 gap1 = N / 2 = 5,即相隔距離為 5 的元素組成一組,可以分為 5 組。

接下來,按照直接插入排序的方法對每個組進行排序。

在第二趟排序中,我們把上次的 gap 縮小一半,即 gap2 = gap1 / 2 = 2 (取整數)。這樣每相隔距離為 2 的元素組成一組,可以分為 2 組。

按照直接插入排序的方法對每個組進行排序。

在第三趟排序中,再次把 gap 縮小一半,即gap3 = gap2 / 2 = 1。 這樣相隔距離為 1 的元素組成一組,即只有一組。

按照直接插入排序的方法對每個組進行排序。此時,排序已經結束。

需要注意一下的是,圖中有兩個相等數值的元素 5 和 5 。我們可以清楚的看到,在排序過程中,兩個元素位置交換了。

所以,希爾排序是不穩定的演算法。

程式碼:

    public int
[] shellsort(int A[], int n) { int i, j, gap; for (gap = n / 2; gap > 0; gap /= 2) //步長 for (i = 0; i < gap; i++) //直接插入排序 { for (j = i + gap; j < n; j += gap) if (A[j] < A[j - gap]) { int
temp = A[j]; //取當前下標 int k = j - gap; //取有序部門的最後一個結點 while (k >= 0 && A[k] > temp) //比較有序部分的最大值(最後一個即是最大值) { A[k + gap] = A[k]; //將有序部分的值後移 k -= gap; //往前面的有序結點移動,繼續比較(每個結點相隔gap) } A[k + gap] = temp; } } return A; }