直接插入排序和希爾排序

2021-08-06 05:30:15 字數 2279 閱讀 1976

一、直接插入排序(插入排序)

1.1 基本思想和原理

將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。

要點:設立哨兵,它有兩個作用:

① 進入查詢(插入位置)迴圈之前,它儲存了r[i]的副本,使不致於因記錄後移而丟失r[i]的內容;

② 它的主要作用是:在查詢迴圈中」監視」下標變數j是否越界。一旦越界(即j=0),因為r[0]可以和自己比較,迴圈判定條件不成立使得查詢迴圈結束,從而避免了在該迴圈內的每一次均要檢測j是否越界(即省略了迴圈判定條件」j>=1」)。

直接插入排序的例項如下圖所示:

1.2 python實現的**

def

straightinsert

(nums):

# 直接插入排序: 小->大

for i in range(1, len(nums)):

index = nums[i]

j = i - 1

while j >= 0

and nums[j] > index:

nums[j + 1] = nums[j] # 前面的大值先賦給後面的值,往後移動

j -= 1

nums[j + 1] = index # 將資料插入到正確的位置

return nums

if __name__=='__main__':

s = [3, 4, 1, 6, 2, 9, 7, 0, 8, 5]

print(straightinsert(s))

1.3 總結

直接插入排序的時間複雜度是o(n2)。它是一種穩定排序的演算法。

二、希爾排序(插入排序)

2.1 基本思想

希爾排序的實質就是分組插入排序,相對直接插入排序有較大的改進,該方法又稱縮小增量排序,因dl.shell於2023年提出而得名。

該方法的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前三種方法有較大提高。

希爾排序的思想如下圖例項所示:

2.2 python實現的**

先將要排序的一組記錄按某個增量d(n/2,n為要排序數的個數)分成若干組子串行,每組中記錄的下標相差d。對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。繼續不斷縮小增量直至為1,最後使用直接插入排序完成排序。

def

shellsort

(nums):

# 設定步長

step = len(nums)/2

while step > 0:

for i in range(step, len(nums)):

# 類似插入排序, 當前值與指定步長之前的值比較, 符合條件則交換位置

while i >= step and nums[i-step] > nums[i]:

nums[i], nums[i-step] = nums[i-step], nums[i]

i -= step

step = step/2

return nums

if __name__ == '__main__':

nums = [9,3,5,8,2,7,1]

print shellsort(nums)

2.3 總結

希爾排序時效分析很難,關鍵碼的比較次數與記錄移動次數依賴於增量因子序列d的選取,特定情況下可以準確估算出關鍵碼的比較次數和記錄的移動次數。目前還沒有人給出選取最好的增量因子序列的方法。增量因子序列可以有各種取法,有取奇數的,也有取質數的,但需要注意:增量因子中除1 外沒有公因子,且最後乙個增量因子必須為1。希爾排序方法是乙個不穩定的排序方法。

不過需要說明的是大量研究表明,當增量序列為d[k]=2t-k+1-1時,希爾排序的時間複雜度為o(n1.5),其中t為排序趟數,這個排序的時間複雜度是要好於直接插入排序的o(n2)。

直接插入排序和希爾排序

if defined insertsort h define insertsort h include define maxsize 100 typedef int keytype 關鍵字型別用來比較 typedef char infotype 其他型別的資訊 typedef structrecty...

直接插入排序和希爾排序

一 插入排序 在一組無序的陣列中,假設第乙個有序,每一次陣列中剩餘的元素與第乙個比較,然後逐個插入到乙個有序的序列中,直到這個陣列所有的數字有序為止 二 直接插入演算法 演算法思路 1 我們先假設第乙個有序的數字下標為end,2 下乙個要插入的數字 tmp 繼續構成有序就直接插入,此時end向後挪一...

直接插入排序 和 希爾排序

直接插入排序的思想 include include using namespace std 直接插入排序 9,1,5,8,3,7,4,6,2 void insertsort int arr,int sz else break arr end key void printf int arr,int s...