直接插入排序:每次取乙個記錄插入到已經排好序的有序表中,得到乙個新的有序表。在插入過程中為了防止下標出界,需要在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。第一次交換後會...