一、直接插入排序(插入排序)
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...