python資料結構與演算法篇 排序

2022-09-15 19:24:12 字數 3220 閱讀 3463

1.氣泡排序(英語:bubble sort)

它重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

氣泡排序演算法的運作如下:

首先,列表每兩個相鄰的數,如果前邊的比後邊的大,那麼交換這兩個數……

def

bubble_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次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。

def

selection_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)

列表被分為有序區和無序區兩個部分。最初有序區只有乙個元素。

每次從無序區選擇乙個元素,插入到有序區的位置,直到無序區變空。

原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

def

insert_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大;

遞迴完成排序。

def

qsort_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,即所有元素在同一組內進行直接插入排序。

希爾排序每趟並不使某些元素有序,而是使整體資料越來越接近有序;最後一趟排序使得所有資料有序。

def

shell_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大的數,放...