1.氣泡排序(英語:bubble sort)
它重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
氣泡排序演算法的運作如下:
首先,列表每兩個相鄰的數,如果前邊的比後邊的大,那麼交換這兩個數……
defbubble_sort(alist):
for j in range(len(alist)-1,0,-1):
#j表示每次遍歷需要比較的次數,是逐漸減小的
for i in
range(j):
if alist[i] > alist[i+1]:
alist[i], alist[i+1] = alist[i+1], alist[i]
時間複雜度
2.選擇排序(selection sort)
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
選擇排序的主要優點與資料移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有乙個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。
defselection_sort(alist):
n =len(alist)
#需要進行n-1次選擇操作
for i in range(n-1):
#記錄最小位置
min_index =i
#從i+1位置到末尾選擇出最小資料
for j in range(i+1, n):
if alist[j] min_index =j
#如果選擇出的資料不在正確位置,進行交換
if min_index !=i:
alist[i], alist[min_index] =alist[min_index], alist[i]
alist = [54,226,93,17,77,31,44,55,20]
selection_sort(alist)
print(alist)
時間複雜度
3.插入排序(英語:insertion sort)
列表被分為有序區和無序區兩個部分。最初有序區只有乙個元素。
每次從無序區選擇乙個元素,插入到有序區的位置,直到無序區變空。
原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
definsert_sort(li):
#從第二個位置,即下標為1的元素開始向前插入
for i in range(1, len(li)):
tmp =li[i]
j = i - 1
while j >= 0 and li[j] >tmp:
li[j+1]=li[j]
j = j - 1li[j + 1] = tmp
時間複雜度
4.快速排序(英語:quicksort)
,又稱劃分交換排序(partition-exchange sort)
通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
步驟為:
從數列中挑出乙個元素,稱為"基準"(pivot),
重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會結束,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
快排思路:
取乙個元素p(第乙個元素),使元素p歸位;
列表被p分成兩部分,左邊都比p小,右邊都比p大;
遞迴完成排序。
defqsort_rec(li,l,r):
if l>=r:
return
i=l j=r
pivot=li[i]
while iwhile iand li[j]>=pivot:
j-=1
if ili[i]=li[j]
i+=1
while iand li[i]<=pivot:
i=i+1
if ili[j]=li[i]
j-=1li[i]=pivot
qsort_rec(li,l,i-1)
qsort_rec(li,i+1,r)
@cal_time
defquick_sort2(li):
qsort_rec(li,0,len(li)-1)
時間複雜度
5.希爾排序
首先取乙個整數d1=n/2,將元素分為d1個組,每組相鄰量元素之間距離為d1,在各組內進行直接插入排序;
取第二個整數d2=d1/2,重複上述分組排序過程,直到di=1,即所有元素在同一組內進行直接插入排序。
希爾排序每趟並不使某些元素有序,而是使整體資料越來越接近有序;最後一趟排序使得所有資料有序。
defshell_sort(li):
gap = int(len(li) // 2)
while gap >= 1:
for i in
range(gap, len(li)):
tmp =li[i]
j = i -gap
while j >= 0 and tmp li[j + gap] =li[j]
j -=gap
li[i - gap] =tmp
gap = gap // 2
Python 資料結構與演算法 快排
1.先從待排序的陣列中找出乙個數作為基準數 取第乙個數即可 然後將原來的陣列劃分成兩部分 小於基準數的左子陣列和大於等於基準數的右子陣列。然後對這兩個子陣列再遞迴重複上述過程,直到兩個子陣列的所有數都分別有序。最後返回 左子陣列 基準數 右子陣列 即是最終排序好的陣列。def quicksort n...
資料結構與演算法 python排序演算法 氣泡排序
排序演算法 英語 sorting algorithm 是一種能將一串資料依照特定順序進行排列的一種演算法。排序演算法的穩定性 穩定排序演算法會讓原本有相等鍵值的紀錄維持相對次序。也就是如果乙個排序演算法是穩定的,當有兩個相等鍵值的紀錄r和s,且在原本的列表中r出現在s之前,在排序過的列表中r也將會是...
資料結構與演算法 python實現快排
python實現快速排序 記錄第乙個坑的值,在最後做填充 i start 初始位置和末尾會發上改變,所以需要先做好記錄 j end m end 初始從最後面開始挖坑,所以先記錄 while start end while start end and l start x 找出比假定的中位數x大的數,放...