希爾排序的理解和實現 Java

2021-09-12 16:42:40 字數 1937 閱讀 9062

希爾排序(shell sort)這個排序方法又稱為縮小增量排序,是2023年d·l·shell提出來的。

該方法的基本思想是:設待排序元素序列有n個元素,首先取乙個整數increment(小於n)作為間隔將全部元素分為increment個子序列,所有距離為increment的元素放在同乙個子串行中,在每乙個子串行中分別實行直接插入排序。然後縮小間隔increment,重複上述子串行劃分和排序工作。直到最後取increment=1,將所有元素放在同乙個子串行中排序為止。

由於開始時,increment的取值較大,每個子串行中的元素較少,排序速度較快,到排序後期increment取值逐漸變小,子串行中元素個數逐漸增多,但由於前面工作的基礎,大多數元素已經基本有序,所以排序速度仍然很快。

1、給出乙個待排序的資料列:

4、第3趟把間隔縮小為increment= increment/3向下取整+1=1,當增量為1的時候,實際上就是把整個數列作為乙個子串行進行插入排序,**如下:

5、直到increment=1時,就是對整個數列做最後一次調整,因為前面的序列調整已經使得整個序列部分有序,所以最後一次調整也變得十分輕鬆,這也是希爾排序效能優越的體現。

希爾排序實現**:

public

class

shellsort

elem[j + increment]

= elem[0]

;}}}

while

(increment >1)

;}public

static

void

main

(string[

] args)

; shellsort s =

newshellsort()

; s.

shellsort

(elem)

;for

(int i =

1; i < elem.length; i++)}

}

增量increment的取法

增量increment的取法有各種方案。最初shell提出取increment=n/2向下取整,increment=increment/2向下取整,直到increment=1。但由於直到最後一步,在奇數字置的元素才會與偶數字置的元素進行比較,這樣使用這個序列的效率會很低。後來knuth提出取increment=n/3向下取整+1.還有人提出都取奇數為好,也有人提出increment互質為好。應用不同的序列會使希爾排序演算法的效能有很大的差異。

對於希爾排序其增量increment的選擇非常關鍵,最燃至今其怎樣選擇還是乙個數學難題,但是通過大量研究表明,當增量序列為dlta[k]=2t−

k+12^

2t−k+1

-1(0≤k≤t≤log

2log_2

log2

​(n+1))時,可以獲得不錯的效率,其時間複雜度為o(n3/

2n^n3/2

),要好於直接排序的o(n

2n^2

n2),需要注意的是增量序列的最後乙個增量值必須等於1才行。另外由於記錄是跳躍性的移動,希爾排序並不是一種穩定的排序演算法。

本文參考

希爾排序 java實現

先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進行依次直接插入排序。操作方法 選擇乙個增量序列t1,t2,tk,其中ti tj,tk 1 按增量序列個數k,對序列進行k 趟排序 每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m...

希爾排序 Java實現

希爾排序實際上是針對插入排序的一種優化演算法。當被插入的元素要移動到陣列的開始位置時需要比較的次數相當大,通過改變相鄰的元素比較為距離間隔為h的元素比較 h逐漸減小為1 就能減少比較的次數。如下 public class tester shellsort t for int a t 將陣列中下標為i...

希爾排序 Java實現

希爾排序是對插入排序的優化,減少了元素移動位置的次數,又叫做縮小增量排序 先將待排序的陣列元素按照增量分成多個子串行,對每個子串行進行插入排序,直到子串行相對有序 然後縮小增量,重複第一步的操作 直到增量為1的時候,再最終進行一次插入排序,使得元素有序。希爾排序 public static void...