1. 程式人生 > >排序演算法(1):氣泡排序和插入排序

排序演算法(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