氣泡排序需要多次遍歷列表。它比較相鄰的項並交換那些無序的項。每次遍歷列表將下乙個最大的值放在其正確的位置。實質上,每個項「冒泡」到它所屬的位置。
用python寫交換操作時,與大多數程式語言略有不同(需要臨時儲存位置),python可以執行同時賦值,語句 a,b = b,a 兩個賦值語句同時完成。
下圖展現了氣泡排序的第一次遍歷:
用python實現氣泡排序的**如下:
氣泡排序通常被認為是最低效的排序方法,因為它必須在最終位置被知道之前交換項。 這些「浪費」的交換操作是非常昂貴的。 然而,因為氣泡排序遍歷列表的整個未排序部分,它有能力做大多數排序演算法不能做的事情。特別地,如果在遍歷期間沒有交換,則我們知道該列表已排序。 如果發現列表已排序,可以修改氣泡排序提前停止。這意味著對於只需要遍歷幾次列表,氣泡排序具有識別排序列表和停止的優點。
在原來的氣泡排序基礎上設定exchange,初始值設定為true。只要某趟氣泡排序有交換,則exchange在迴圈中為true,否則為false,停止冒泡。
短氣泡排序**如下:
def
shortbubblesort
(alist):
exchanges = true
passnum = len(alist)-1
while passnum > 0
and exchanges:
exchanges = false
for i in range(passnum):
if alist[i]>alist[i+1]:
exchanges = true
alist[i], alist[i+1] = alist[i+1], alist[i]
passnum = passnum-1
alist=[20,30,40,90,50,60,70,80,100,110]
shortbubblesort(alist)
print(alist)
始終在列表的較低位置維護乙個排序的子列表。然後將每個新項 「插入」 回先前的子列表,使得排序的子列表稱為較大的乙個項。其過程如下圖所示:
我們開始假設有乙個項(位置 0 )的列表已經被排序。在每次遍歷時,對於每個項 1至 n-1,將針對已經排序的子列表中的項檢查當前項。當我們回顧已經排序的子列表時,我們將那些更大的項移動到右邊。 當我們到達較小的項或子列表的末尾時,可以插入當前項。如下圖所示:
python實現**如下:
def
insertionsort
(alist):
for index in range(1,len(alist)):
currentvalue = alist[index]
position = index
while position>0
and alist[position-1]>currentvalue:
alist[position]=alist[position-1]
position = position-1
alist[position]=currentvalue
alist = [54,26,93,17,77,31,44,55,20]
insertionsort(alist)
print(alist)
關於移位和交換的乙個注意事項也很重要。通常,移位操作只需要交換大約三分之一的處理工作,因為僅執行一次分配。在基準研究中,插入排序有非常好的效能。
參考資料:《problem-solving-with-algorithms-and-data-structure-using-python》
排序演算法 氣泡排序 插入排序
氣泡排序 步驟1 從第乙個元素開始與它的下乙個元素比較,如果比下乙個元素大,交換兩個元素的位置 如果小於或者相等,保持不變。每次交換可以保證有序的佇列長度增加1。步驟2 重複步驟1,一直到整個佇列全部有序為止。比如對於序列5,4,3,2,1,經過第一次交換後佇列改變為 4,3,2,1,5 第二次交換...
《演算法》選擇排序 插入排序 氣泡排序
選擇排序,演算法 p156 package algorithm public class selection p156 for int i 0 i n i public static void main string args test.sort a 思路 將第乙個元素與剩餘所有元素相比,如果有比第...
排序演算法 氣泡排序 選擇排序 插入排序
氣泡排序演算法 氣泡排序是最簡單的排序演算法之一。此演算法具有二次方程增長階,因此僅適合排序小列表。氣泡排序演算法是階o n 2 的演算法 package com.szy.structure.sort public class bubblesort system.out.println 排序前 fo...