其排序時間複雜度為
希爾排序每一次都是對子列表進行了一次插入排序,也就是說每一輪的遍歷都生成了"更有序"列表。它的最大複雜度為nums = [54,26,93,17,77,31,44,55,20]
for i in range(1,len(nums)):
currentvalue = nums[i]
position = i
while position>0 and currentvalue在最壞的情況下,插入排序演算法的比較是前n-1個整數之和(1+2+3+...+n-1),對應的複雜度為
在最好的情況下(列表已經有序),每一論只比較一次(1+1+1.....),對應的複雜度為
所以,當插入乙個新元素,且原有列表已經有序的情況下,插入排序很有效率。
希爾排序也稱"遞減增量排序",它對插入排序做了改進,將列表分成數個子列表,並對每乙個子列表應用插入排序。如何切分列表是希爾排序的關鍵(並不是連續切分,而是使用增量i(有時稱作為步長),選取所有間隔為i的元素組成子列表)
def gapinsertionsort(alist, start, gap):
for j in range(start+gap,len(alist),gap):#以最小元素為為最小端進行插入排序
position = j
currentvalue = alist[position]
while position > start and alist[position] < alist[position-gap]:
alist[position] = alist[position-gap]
alist[position-gap] = currentvalue
position -=gap
alist[position] = currentvalue
nums = [54,26,93,17,77,31,44,55,20]
iter = len(nums)//2 #第一次分成iter個子列表
while iter > 0:
for startposion in range(iter):
gapinsertionsort(nums , startposion, iter)#對每個子列表進行插入排序
iter //=2 重複劃分子列表,直到子列表為1
print(nums)
結果:[17, 20, 26, 31, 44, 54, 55, 77, 93]
歸併排序採用的是分治策略。它是一種遞迴演算法,每次將乙個列表一分為二。如果列表為空或者只有乙個元素,那麼它就變得有序了。當兩個部分都有序時,就進行歸併(將兩個較小的有序列表歸併為乙個有序列表的過程)這一基本操作。如圖1所示:
該圖截選於《大話資料結構》
遞迴版本:
def mergesort(alist,l,r):
print('spliting', alist[l:r + 1])#列印每一次遞迴切分的子列表
if l>1)#獲取子列表中的中鍵
mergesort(alist,l,mid)#對左部分排序
mergesort(alist,mid+1,r)#對右部分排序
merge(alist,l,mid,r)#將有序的兩個子列表合併在一起
def merge(alist,l,mid,r):
r=mid+1
l=ltemp=
while l<=mid and r<=r:#先對兩個子列表進行比對,把小指新增到temp陣列,其中必有乙個子列表被遍歷完
整個結果圖也是整個遞迴以及merge的過程圖,應該來說是便於理解的。spliting表示二分列表的過程,merging表示合併兩個子列表的過程
複雜度分析:由圖一所示,當列表的長度為n時,能切分
插入排序,希爾排序,歸併排序
public class mainclass shellsort1 arr foreach var item in arr console.readkey static void shellsort1 int arr arr j step temp step step 2 static void i...
排序演算法 插入,希爾和歸併
如有錯誤,請指出,多謝。來自菜鳥教程,多謝。一 插入排序 插入排序的基本思想是 每步將乙個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止 import random def insertsort arr for i in range 1,len arr 獲取前...
排序(插入排序,希爾排序,歸併排序,快速排序)
1.插入排序 每一步將乙個待排序的元素按照其關鍵字值的大小插入到已排序序列的適當位置,知道待排序元素插入完為止。1 核心 void sort int a,int n 插入排序 a j temp 2 例題 將序列 3,1,4,1,5,9,2,6,5用插入排序排位公升序列。include void so...