python的快速排序演算法詳解

2021-09-26 21:13:06 字數 1858 閱讀 6025

def quick_sort(arr):

if len(arr) < 2: #當資料集長度為1時,結束遞迴

return arr

mid = arr[len(arr) // 2] #基準數可以隨便選,我這裡就對2取整了

left,right = , #申明兩個列表用來儲存左右分區的數

arr.remove(mid) #將基準數從陣列中移除

for i in arr: #比較大小,分左右區

if i > mid:

else:

return quick_sort(left)+[mid]+quick_sort(right) #遞迴分割槽最後合併

快排和歸併排序比較類似,都是分治+迭代的思想,利用遞迴完成

歸併是在合併的時候再進行排序,並直接是將陣列從中間二分

而快排是大小分割槽,在分解的時候就已經排序了,合併的時候就不用再排序,效率比歸併要好

快排先會在當前陣列選出乙個基準數,將小於基準數的元素放左邊,大於基準數的放右邊,

然後將左邊和右邊的陣列也進行以上步驟,直到分割槽中只有乙個元素,就停止並開始返回。

返回是一層一層的返回的,返回的規則是:左邊分割槽+基準數+右邊分割槽

快排是一種不穩定排序,相同值的順序可能會被改變

快排也是一種比較排序

時間複雜度:快排的時間複雜度為o(nlogn)

空間複雜度:排序時需要另外申請空間,並且隨著數列規模增大而增大,其複雜度為:o(nlogn)

快速排序有乙個缺點就是對於小規模的資料集效能不是很好。

可能有人認為可以忽略這個缺點不計,因為大多數排序都只要考慮大規模的適應性就行了。

但是快速排序演算法使用了分治技術,最終來說大的資料集都要分為小的資料集來進行處理,

所以快排分解到最後幾層效能不是很好,所以我們就可以使用揚長避短的策略去優化快排:

先使用快排對資料集進行排序,

此時的資料集已經達到了基本有序的狀態然後當分割槽的規模達到一定小時,便停止快速排序演算法,

而是改用插入排序,因為我們之前講過插入排序在對基本有序的資料集排序有著接近線性的複雜度,

效能比較好。

這一改進被證明比持續使用快速排序演算法要有效的多。

一句話理解快排:

從陣列中選出乙個基準數,將每個元素與基準數做比較,小於基準數的放入左邊分割槽,

大於基準數的放入右邊分割槽,然後把左右分區作為新的資料集,進行遞迴分割槽,直到分割槽只有

乙個元素,然後進行合併

快排優化:面對大資料集時,先使用快排,在規模達到一定小時,改用插入排序

一句話實現:

quick_sort = lambda array: array if len(array) <= 1 else quick_sort([item for item in array[1:] if item <= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]])
這個就是預設將每個資料集的第乙個資料作為基準數進行快排

實驗:

l1 = [random.choices(range(i+100)) for i in range(100000)]

start = time.time()

arr = quick_sort(l1)

print(arr)

print(time.time()-start)

結果

0.4980285167694092
10萬條資料,5秒

歸併和希爾插入10萬條資料差不多2-4秒之間

選擇排序,插入排序和氣泡排序十分鐘左右

詳解python實現快速排序演算法

快速排序嚴重依賴分割槽,分割槽部分完成就代表排序成功了一半 1 詳細思路見 注釋部分 def quick sort l,low,high 分割槽的過程 low代表左指標,high代表右指標 1 low會逐個向右移動,遇到大於或等於基準元素時,停止 2 high會逐個向左移動,遇到小於或等於基準元素時...

快速排序演算法詳解

1.1 演算法分析 快速排序是一種不穩定的,時間複雜度為o nlogn 的排序演算法.基本思想 1.選定基準值key。2.通過雙指標不斷地移動,將比key大的值移動到key的右邊,比key小的值移動到key的左邊,直到雙指標相遇 即代表該過程已完成 3.上述過程完成後,對於以原key區分形成的兩個子...

python 快速排序詳解

快速排序 基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。def quick sort li,start,end 分治 一分為二 start end 證明要處理的資料只有...