排序演算法之(4) 希爾排序

2021-08-20 03:15:18 字數 974 閱讀 4793

希爾排序(shell sort)是d.l.shell於2023年提出來的一種排序演算法,在這之前排序演算法的時間複雜度基本都是o(

n2) o(n

2)的,希爾排序演算法是突破這個時間複雜度的第一批演算法之一。

我們前一節講的直接插入排序,應該說,它的效率在某些時候是很高的,比如,我們的記錄本身就是基本有序的,我們只需要少量的插入操作,就可以完成整個記錄集的排序工作,此時直接插入很高效。還有就是記錄數比較少時,直接插入的優勢也比較明顯。可問題在於,兩個條件本身就過於苛刻,現實中記錄少或者基本有序都屬於特殊情況。

希爾排序其實可以理解為是聰明版的插入排序,即先把幾小波資料完成插入排序,最後再把已經插入排序過的資料再次進行插入排序。

這個演算法的時間非常快。

注意看,一開始不同顏色塊就是不同的波次,每次的分組是會慢慢減少的。一開始組可以設定為

n n

,即n個資料,相當於開始什麼事情都不做,接下來組的數量按13

' role="presentation">131

3衰減。具體請看**。

//輔助函式:交換兩個變數

void swap(int*a,int*p)

//希爾排序

//插入排序的加強版,不是一次性進行插入,而是分成一撥撥來進行

//比如奇數下標的為一撥,偶數下標的為一撥,然後再對分好的兩撥進行插入排序

//也就是一開始是隔一定step>1進行插入排序,最後的step=1

//這個步長的變動方式有多種,可是是 step:=step/3+1

//對大量的資料,排序效率明顯比插入排序高

void shellsort(int* arr,int len)

else}}

}}while(step>1);

}

學習排序演算法4 希爾排序

此 需要用到我前面三個部落格的部分 因為此處將希爾排序和選擇排序,插入排序進行了執行時間的比較 希爾排序 思想 是一種對插入排序的改進,因為插入排序每次交換只能交換相鄰的元素,元素挪到自己正確的位置可能需要移動很多次。所以希爾排序交換不相鄰的元素,以對陣列進行區域性排序,並最終用插入排序將區域性有序...

排序演算法總結 4 希爾排序

插入排序適合資料量較小或者部分有序的序列排序,但是當序列的最小值在最右端時,需要比較n 1次並且移動n 1次才能將最小數插入序列的最左端。希爾排序對直接插入排序做了改進。在插入排序的基礎上,將序列分組,利用了插入排序對資料量較小和部分有序序列高效的性質。希爾排序首先將序列以 增量 h分成h組,分組情...

排序演算法4 希爾排序(shell sort)

希爾排序是插入排序的優化版本,實現原理 將未知數組分為以gap為間隔的n個序列 gap的初值通常取需要排序數列的長度,每次排序之後取 gap 3 1 然後將這n個序列中的數進行比較,例如先對比序列1和序列2中的第乙個數字,若序列2中的第乙個小於學列1中的第乙個則更換兩個數的位置,然後比較序列2和序列...