各種排序演算法的分析與比較

2021-08-27 18:02:34 字數 2610 閱讀 8035

直接插入排序:每次取乙個記錄插入到已經排好序的有序表中,得到乙個新的有序表。在插入過程中為了防止下標出界,需要在r[0]處加入乙個監視哨。該演算法的時間複雜度為o(

def insertsort(l):

l.insert(0,0) #插入監視哨,c初值為0

for i in range(2,len(l)): #第乙個元素為有序,所以直接從第二個元素開始比較

if l[i]實驗結果:

為了方便以後可以更快的熟悉演算法思想,新增乙個例項:

希爾排序:希爾排序是由直接插入排序發展而來,將待排序列分割成若干個子串行,並分別進行直接插入排序,(子串行是由相隔某個增量的記錄組成的,而非分段),最後進行一次直接插入排序。注意:增量序列的值應該沒有除1以外的公因子,且最後乙個增量值必須為1.該演算法的時間複雜度小於o(

def shellinsert(l,dk):    #一次排序

for i in range(dk+1,len(l)):

if l[i]0 and l[0]實驗結果:

輸出每次排序後的結果以及最終排序結果

例項:

氣泡排序:每一輪排序都從第一位開始將相鄰的兩位進行比較,如果t-1位比t位的值大,則將其交換順序。每輪排序後,都會將未排序序列的最大數移到最後一位。當開始時序列即為從小到大有序序列,只需要一次就可以完成排序,時間複雜度為o(n); 當序列為逆序排列時,所需排序次數為n-1次,每次比較的次數為n-i次,時間複雜度為o(

def bubblesort(l):

for i in range(len(l)-1):

flag=0 #判斷序列是否發生變化

for j in range(len(l)-i-1):

if l[j]>l[j+1]:

l[j],l[j+1]=l[j+1],l[j]

flag=1

print(l)

if flag==0:

break

執行結果:

例項介紹:

快速排序:第一趟快排將列表分為兩部分,一部分的關鍵字均比另一部分關鍵字小,然後再分別對兩部分進行排序。演算法首先選定一點作為樞紐,然後分別設定兩個指標low和high,high從尾部開始,找到小於樞紐的點,將其與樞紐交換;然後low從頭部開始找到大於樞紐的點將其與樞紐交換。依次排序後以樞紐為中心分為兩部分,且左邊均比樞紐小,右邊均比樞紐大。快速排序的平均時間複雜度為所有內部排序中最優的,但是在序列有序的情況下,其效能不能達到o(n)。空間複雜度為o(logn),因為每次快排包括遞迴過程中的樞紐值,都需要儲存在乙個棧中。(疑問:我覺得空間複雜度為o(1),因為在母串快排結束後,才開始子串的快排,且兩個子串是順序進行的,所以只需要乙個空間儲存樞紐值,就可以了。這樣理解有什麼問題呢?)

def qsort(l,low,high):

low,high=low,high

pivot=l[low]

while (lowpivot and high>low:

high-=1

if high>low:

l[low]=l[high]

low+=1

while l[low]low:

low+=1

if high>low:

l[high]=l[low]

high-=1

l[low]=pivot

if lowlow+1:

qsort(l,low+1,high)

def quicksort(l):

qsort(l,0,len(l)-1)

print(l)

執行結果:

例項:

各種排序演算法分析與比較

1.直接插入排序 每一趟將乙個待排序的元素作為關鍵字,按照其關鍵字的大小插入到已經排好的部分序列的適當位置上。平均時間複雜度為o n2 空間複雜度為o 1 void insertsort int r,int n r j 1 temp 2.氣泡排序 平均時間複雜度為o n2 空間複雜度為o 1 voi...

各種排序演算法比較

花了很長時間終於把排序的基礎學了一下,這段時間學了很多東西,總結一下 學的排序演算法有 插入排序,合併排序,氣泡排序,選擇排序,希爾排序,堆排序,快速排序,計數排序,基數排序,桶排序 沒有實現 比較一下學習後的心得。我不是很清楚他們的時間複雜度,也真的不知道他們到底誰快誰慢,因為書上的推導我確實只是...

各種排序演算法比較

排序相關的演算法複雜度分析 下邊分別實現下各個演算法 簡單選擇排序 1 簡單選擇排序 2void select sort int a,intn 3 16 17swap a i a index 18 19 這裡簡單選擇排序之所以不穩定是因為交換的時候會打亂順序,例如 5,4,5,1,6。第一次交換後會...