Python筆記 排序演算法實現(1)

2021-06-27 07:37:20 字數 2644 閱讀 3065

排序是資料結構中常用的方法,現用python實現起泡排序和選擇排序。

將被排序的記錄陣列r[1..n]垂直排列,每個記錄r[i]看作是重量為r[i].key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r:凡掃瞄到違反本原則的輕氣泡,就使其向上"飄浮"。如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。

氣泡排序是就地排序,且它是穩定的。

(1)初始

r[1..n]為無序區。

(2)第一趟掃瞄

從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(r[n],r[n-1]),(r[n- 1],r[n-2]),…,(r[2],r[1]);對於每對氣泡(r[j+1],r[j]),若r[j+1].key

第一趟掃瞄完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置r[1]上。

(3)第二趟掃瞄

掃瞄r[2..n]。掃瞄完畢時,"次輕"的氣泡飄浮到r[2]的位置上……

最後,經過n-1 趟掃瞄可得到有序區r[1..n]

注意:第i趟掃瞄時,r[1..i-1]和r[i..n]分別為當前的有序區和無序區。掃瞄仍是從無序區底部向上直至該區頂部。掃瞄完畢時,該區中最輕氣泡飄浮到頂部位置r[i]上,結果是r[1..i]變為新的有序區。

python 實現:

def bubblesort(l):

size = len(l)

for i in range(size-1):

count = 0

for j in range(size-i-1):

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

temp = l[j]

l[j]=l[j+1]

l[j+1] = temp

count += 1

print(l)

if count == 0:

break

l = [1,4,6,9,2,0,3,8,7,5]

print l

bubblesort(l)

結果如下:

此外,起泡排序是穩定排序,其時間複雜度為o(n^2),空間複雜度為o(1)。在最好的情況下,即陣列基本有序時,時間複雜度為o(n)。

此外,選擇排序也是簡單排序中的一種,不過比起泡排序的效率要高,並且也比較容易實現。

基本思想

每一趟從待排序的資料元素中選出最小(或最大)的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。

選擇排序是不穩定的排序方法。n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:

①初始狀態:無序區為r[1..n],有序區為空。

②第1趟排序

在無序區r[1..n]中選出關鍵字最小的記錄r[k],將它與無序區的第1個記錄r[1]交換,使r[1..1]和r[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。 ……

③第i趟排序

第i趟排序開始時,當前有序區和無序區分別為r[1..i-1]和r(1≤i≤n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄 r[k],將它與無序區的第1個記錄r交換,使r[1..i]和r分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

這樣,n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

【示例】:

初始關鍵字 [49 38 65 97 76 13 27 49]

第一趟排序後 13 [38 65 97 76 49 27 49]

第二趟排序後 13 27 [65 97 76 49 38 49]

第三趟排序後 13 27 38 [97 76 49 65 49]

第四趟排序後 13 27 38 49 [49 97 65 76]

第五趟排序後 13 27 38 49 49 [97 65 76]

第六趟排序後 13 27 38 49 49 65 [97 76]

第七趟排序後 13 27 38 49 49 76 [97 76]

最後排序結果 13 27 38 49 49 76 76 97

python實現:

def selectsort(l):

size = len(l)

for i in range(0,size):

min=l[i]

index = i

for j in range(i,size):

if l[j] < min:

min=l[j]

index=j

temp=l[i]

l[i]=min

l[index]=temp

print(l)

l = [1,4,6,9,2,0,3,8,7,5]

print l

selectsort(l)

結果如圖。

此外,選擇排序是不穩定排序,在最好和最壞的情況下其時間複雜度為o(n^2),空間複雜度為o(1)。

排序演算法的python實現 1

參考教材用python複習了一下排序演算法。在開頭總結一下整體排序演算法給我感覺是 元素之間怎麼進行對比,各類排序演算法都是在此操作上不斷改進,直到時間複雜度快速排序目前已經達到了o nlogn 最內層核心思想是相鄰元素的交換比較 if alist i alist i 1 alist i alist...

排序演算法python實現

先列出一些演算法複雜度的識別符號號的意思,最常用的是o,表示演算法的上屆,如 2n2 o n2 而且有可能是漸進緊確的,意思是g n 乘上乙個常數係數是可以等於f n 的,就是所謂的a b。而o的區別就是非漸進緊確的,如2n o n2 o n2 確實可以作為2n的上屆,不過比較大,就是所謂的a其他符...

python排序演算法實現

coding utf 8 氣泡排序 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大 公升序 就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步...