python常見排序演算法的實現(一)
阿新 • • 發佈:2019-01-25
在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中,元組其實是由逗號“,”來界定的,而不是括號)。