1. 程式人生 > >python常見排序演算法的實現(一)

python常見排序演算法的實現(一)

在Python程式設計的實踐中,我們往往會遇到排序問題,比如在對搜尋引擎搜尋結果的排序(沒有排序就沒有Google、baidu等搜尋引擎的存在),當然,這樣的例子數不勝數。我大學中的必修課程《資料結構》也會花大量篇幅講解排序。之前一段時間,由於需要,我複習了一下排序演算法,並用Python實現了各種排序演算法,放在這裡作為參考,以備不時之需。

        最簡單的排序有三種:插入排序,選擇排序和氣泡排序。這三種排序比較簡單,它們的平均時間複雜度均為0(n^2)。

插入排序

插入排序就是一個元素在進行比較後,插入到列表中的正確位置。實現這種排序要考慮把列表的一部分看作已排序,而其它的尚未排序。然後將未排序部分的元素與已排序部分的元素進行比較,並將其在已排序部分插入到正確的位置。要記住的是,列表的排序部分一直保持已排序狀態。


def insertion_sort(sort_list):
    iter_len = len(sort_list)
    if iter_len < 2:
        return sort_list
    for i in range(1, iter_len):
        key = sort_list[i]
        j = i - 1
        while j >= 0 and sort_list[j] > key:
            sort_list[j+1] = sort_list[j]
            j -= 1
        sort_list[j+1] = key
    return sort_list

插入排序用於少量元素時效果不錯,其執行時複雜度與氣泡排序相似。但一般認為它優於氣泡排序。

氣泡排序

氣泡排序就是重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行的,直到沒有再需要交換的元素,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端,故名“氣泡排序”。
def bubble_sort(sort_list):
    iter_len = len(sort_list)
    if iter_len < 2:
        return sort_list
    for i in range(iter_len-1):
        for j in range(iter_len-i-1):
            if sort_list[j] > sort_list[j+1]:
                sort_list[j], sort_list[j+1] = sort_list[j+1], sort_list[j]
    return sort_list

        選擇排序

選擇排序是一種簡單直觀的排序演算法。它的工作原理是固定位置,找元素。也就是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)。

def selection_sort(sort_list):
    iter_len = len(sort_list)
    if iter_len < 2:
        return sort_list
    for i in range(iter_len-1):
        smallest = sort_list[i]
        location = i
        for j in range(i, iter_len):
            if sort_list[j] < smallest:
                smallest = sort_list[j]
                location = j
        if i != location:
            sort_list[i], sort_list[location] = sort_list[location], sort_list[i]
    return sort_list

在這三例排序程式碼中我們可以看到這樣的句子:

sort_list[i], sort_list[location] = sort_list[location], sort_list[i]
如果你不瞭解Python的話可能會覺得奇怪,沒錯,這是交換兩個數的做法,通常在其他語言中如果要交換a與b的值,常常需要一箇中間變數temp,首先把a賦給temp,然後把b賦給a,最後再把temp賦給b。但是在python中你就可以這麼寫:a, b = b, a,其實這是因為賦值符號的左右兩邊都是元組(這裡需要強調的是,在python中,元組其實是由逗號“,”來界定的,而不是括號)。