十大排序演算法(四)--- 快速排序

十大排序演算法(四)——- 快速排序

快速排序演算法採用的是分治法的思想(Divide and Conquer), 它把一個待排序的陣列,以某個元素或者稱為基準(這裡記為PIVOT)為界,分為兩個子陣列,比PIVOT小的全部移到到PIVOT左邊,比PIVOT大的全部移動到PIVOT右邊。再分別對以PIVOT分開的兩個子陣列重複該過程,直到無法再分。

快速排序正常情況下時間複雜度為O(nlogn)。最壞情況下為O(n^2)。最壞情況發生在每次排序都需要移動所有剩下待排序的元素,這種情況雖然很少發生,但是為了避免這樣的情況可以採用隨機選擇PIVOT元素的方法來預防。下面描述演算法的實現步驟:

隨機的從待排序陣列中選擇一個元素作為PIVOT

將所有比PIVOT小的數放到PIVOT的左邊,比PIVOT大的數放到PIVOT的右邊。跟PIVOT一樣大的數,放到左右都可以。這個步驟稱為Partition。這樣以PVIOT為界分成了左右兩個子陣列。

對#2分成兩個子陣列遞迴進行#1~#3操作,直到排序完成。

假設我們要對A[5, 3, 6, 1, 2, 8]留個數進行排序,下圖展示了排序的過程。

十大排序演算法(四)--- 快速排序

快速排序過程展示

絕大多數情況下,快速排序是高效的,但是快速排序不是穩定的。下面是python的程式碼實現。有興趣的同學,也可以用其它程式語言嘗試實現一下。

import random

A = [5, 3, 6, 1, 2, 8]

def quick_sorting(data, left, right):

if left >= right : return

mark = random。randint(left, right)

data[left], data[mark] = data[mark], data[left]

mark = left

tmp = data[left]

for i in range(left+1, right+1):

if data[i] < tmp:

mark += 1

data[i], data[mark] = data[mark], data[i]

data[left], data[mark] = data[mark], data[left]

quick_sorting(data, left, mark-1)

quick_sorting(data, mark+1, right)

def main():

right=len(A)-1

left = 0

#Ascending

quick_sorting(A, left, right)

print(A)

if __name__==‘__main__’:

main()

將上面的程式碼儲存到一個文字檔案,字尾名修改為。py。可以用python直譯器執行一下,會輸出如下結果:

十大排序演算法(四)--- 快速排序

可以看到,排序正確。