1. 程式人生 > 實用技巧 >python五大排序演算法

python五大排序演算法

插入排序

插入排序:插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序;首先將第一個作為已經排好序的,然後每次從後的取出插入到前面並排序;

時間複雜度:O(n²)

空間複雜度:O(1)

穩定性:穩定

1
2
3
4
5
6
7
def insert_sort(ilist):
for i in range(len(ilist)):
for j in range(i):
if ilist[i] < ilist[j]:
ilist.insert(j, ilist.pop(i))
break
return ilist

氣泡排序

氣泡排序:它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成

時間複雜度:O(n²)

空間複雜度:O(1)

穩定性:穩定

1
2
3
4
5
6
7
8
9
10
def bubble_sort(blist):
count = len(blist)
for i in range(0, count):
for j in range(i + 1, count):
if blist[i] > blist[j]:
blist[i], blist[j] = blist[j], blist[i]
return blist

blist = bubble_sort([4,5,6,7,3,2,6,9,8])
print(blist)

快排

快速排序:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列

時間複雜度:O(nlog₂n)

空間複雜度:O(nlog₂n)

穩定性:不穩定

1
2
3
4
5
6
7
8
9
10
def quick_sort(qlist):
if qlist == []:
return []
else:
qfirst = qlist[0]
qless = quick_sort([l for l in qlist[1:] if l < qfirst])
qmore = quick_sort([m for m in qlist[1:] if m >= qfirst])
return qless + [qfirst] + qmore

qlist = quick_sort([4,5,6,7,3,2,6,9,8])

選擇排序

選擇排序:第1趟,在待排序記錄r1 ~ r[n]中選出最小的記錄,將它與r1交換;第2趟,在待排序記錄r2 ~ r[n]中選出最小的記錄,將它與r2交換;以此類推,第i趟在待排序記錄r[i] ~ r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢

時間複雜度:O(n²)

空間複雜度:O(1)

穩定性:不穩定

1
2
3
4
5
6
7
8
9
10
def select_sort(slist):
for i in range(len(slist)):
x = i
for j in range(i, len(slist)):
if slist[j] < slist[x]:
x = j
slist[i], slist[x] = slist[x], slist[i]
return slist

slist = select_sort([4,5,6,7,3,2,6,9,8])

歸併演算法

歸併排序:採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併

時間複雜度:O(nlog₂n)

空間複雜度:O(1)

穩定性:穩定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def merge_sort(array):
def merge_arr(arr_l, arr_r):
array = []
while len(arr_l) and len(arr_r):
if arr_l[0] <= arr_r[0]:
array.append(arr_l.pop(0))
elif arr_l[0] > arr_r[0]:
array.append(arr_r.pop(0))
if len(arr_l) != 0:
array += arr_l
elif len(arr_r) != 0:
array += arr_r
return array

def recursive(array):
if len(array) == 1:
return array
mid = len(array) // 2
arr_l = recursive(array[:mid])
arr_r = recursive(array[mid:])
return merge_arr(arr_l, arr_r)

return recursive(array)