排序演算法(1):氣泡排序和插入排序
1.1 氣泡排序
氣泡排序需要多次遍歷列表。它比較相鄰的項並交換那些無序的項。每次遍歷列表將下一個最大的值放在其正確的位置。實質上,每個項“冒泡”到它所屬的位置。
用python寫交換操作時,與大多數程式語言略有不同(需要臨時儲存位置),python可以執行同時賦值,語句 a,b = b,a 兩個賦值語句同時完成。
下圖展現了氣泡排序的第一次遍歷:
用python實現氣泡排序的程式碼如下:
def bubbleSort(alist):
for passnum in range(len(alist)-1,0,-1):
for i in range(passnum):
if alist[i]>alist[i+1]:
alist[i], alist[i+1] = alist[i+1], alist[i]
alist = [54,26,93,17,77,31,44,55,20]
bubbleSort(alist)
print(alist)
1.2 短氣泡排序
氣泡排序通常被認為是最低效的排序方法,因為它必須在最終位置被知道之前交換項。 這些“浪費”的交換操作是非常昂貴的。 然而,因為氣泡排序遍歷列表的整個未排序部分,它有能力做大多數排序演算法不能做的事情。特別地,如果在遍歷期間沒有交換,則我們知道該列表已排序。 如果發現列表已排序,可以修改氣泡排序提前停止。這意味著對於只需要遍歷幾次列表,氣泡排序具有識別排序列表和停止的優點。
在原來的氣泡排序基礎上設定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)
2 插入排序
始終在列表的較低位置維護一個排序的子列表。然後將每個新項 “插入” 回先前的子列表,使得排序的子列表稱為較大的一個項。其過程如下圖所示:
我們開始假設有一個項(位置 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》
http://www.pythonworks.org/pythonds