排序是資料結構中常用的方法,現用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 氣泡排序 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大 公升序 就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步...