一、氣泡排序
1、從前往後相鄰元素進行對比,如果前乙個元素大於後乙個元素則交換,將最大的元素「浮」到最後的位置上
2、再對前n-1個元素進行相同操作
3、持續對越來越少的元素進行相同操作,每一輪都選出當前的最大數,直到沒有任何元素需要比較
優化:1、若某一輪沒有進行任何交換,則說明已經有序,不需要再進行迭代,可以用乙個標誌來記錄這一狀態
2、可以記錄下每一輪最後一次進行交換的位置,這個位置後面的資料已經有序不需要再進行比較,因此可以確定下一輪的迭代範圍
defbubble_sort(list):
n=len(list)
k=nfor i inrange(n):
label= 1
for j in range(1,k):if list[j-1]>list[j]:
list[j],list[j-1]=list[j-1],list[j]
k=jlabel=0iflabel:returnlistreturnlist
a= [8,7,6,5,4]print(bubble_sort(a))
二、選擇排序
1、從未排序列表選出最小數,放入已排序列表第一位
2、再從剩餘的未排序列表選出最小數,放入已排序列表末尾
3、以此類推,直到所有元素排序完畢
defselest_sort(list):
n=len(list)for i inrange(n):
min=ifor j inrange(i,n):if list[j]
min=j
list[min],list[i]=list[i],list[min]returnlist
a= [8,7,6,5,4]print(selest_sort(a))
三、插入排序
對每個未排序的資料,在已排序資料中從後向前掃瞄,尋找相應位置並插入
1、從第乙個元素開始,看作已排序資料
2、取出下乙個元素,從後向前掃瞄已排序資料,尋找插入位置
3、以此類推,直到所有資料都有序
definsert_sort(list):
n=len(list)for i in range(1,n):
temp=list[i]
index=ifor j in range(i,-1,-1):if list[j]>temp:
list[j+1] =list[j]
index=j
list[index]=tempreturnlist
a= [8,7,6,5,4]print(insert_sort(a))
四、希爾排序
希爾排序又稱增量遞減排序,是一種高階的插入排序演算法
1、首先將列表以step=n//2為步長進行劃分,對每個分組進行插入排序
2、將步長縮小至step= step//2,再進行插入排序
3、直到步長縮減為1,進行最後一次插入排序
defshell_sort(list):
n=len(list)
step= n//2
while step>=1:for i inrange(step,n):while i>=step and list[i-step]>list[i]:
list[i-step],list[i]=list[i],list[i-step]
i= i -step
step= step//2
returnlist
a= [8,7,6,5,4]print(shell_sort(a))
五、快速排序
插入排序採用分治法的思想,先確定乙個基準數,然後將小於等於基準數的放到左邊,大於基準數的放大右邊
再對左右分區分別重複上述步驟,直到每個分割槽只剩下乙個數
defquick_sort(list):return qsort(list,0,len(list)-1)defqsort(list,left,right):if left>=right:returnlist
base=list[left]
l=left
r=rightwhile l= base and l
r= r-1
while list[l]<=base and l
l= l+1list[l],list[r]=list[r],list[l]
list[left],list[l]=list[l],list[left]
qsort(list,left,l-1)
qsort(list,r+1,right)return list
六、歸併排序
歸併排序同樣採用分治法的思想,首先遞迴對列表進行分解,再遞迴進行合併
合併的時候,比較兩個列表的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個列表為空,最後把另乙個列表的剩餘部分複製過來即可。
defmerge_sort(list):if len(list)<=1:returnlist
n=len(list)
num= n//2left=merge_sort(list[:num])
right=merge_sort(list[num:])returnmerge(left,right)defmerge(left,right):
l=0r=0
result=while l
l= l+1
else:
r= r+1result= result+left[l:]
result= result+right[r:]returnresult
a= [8,7,6,5,4]print(merge_sort(a))
Python實現經典排序演算法
import random lis list range 100 random.shuffle lis print lis def bubblesort arr for i in range 1 len arr for j in range 0 len arr i if arr j arr j 1 ...
Python 實現經典排序演算法
穩定的排序演算法 氣泡排序 插入排序 歸併排序和基數排序。不是穩定的排序演算法 選擇排序 快速排序 希爾排序 堆排序。a 80,15,45,35,88,46,55,66,22,99,0,1,100 for j in range 0,len a for i in range 0,len a 1 if ...
Python實現經典排序演算法 堆排序
上次說到了經典演算法選擇排序,感覺是比較簡單的演算法,這一次說一說稍微有點難度的堆排序。堆排序的時間複雜度要明顯優於前面的氣泡排序,插入排序和選擇排序 侷限於n較大時 先來講講堆 二叉堆 是乙個陣列,它可以近似被看作是乙個完全二叉樹。樹上每乙個節點對應乙個元素,除了最底層外,該樹是完全充滿的,而且是...