演算法程式設計2 快速排序

2021-10-21 18:32:53 字數 2212 閱讀 6671

任取待排序序列的乙個元素作為中心元素(可以用第乙個,最後乙個,也可以是中間任何乙個),習慣將其稱為pivot,樞軸元素,然後將所有比樞軸元素小的放在其左邊,將所有比它大的放在其右邊,這樣就形成左右兩個子表,然後對左右兩個子表再按照前面的演算法進行排序,直到每個子表的元素只剩下乙個。

可見快速排序用到了分而治之的思想。將乙個陣列分成兩個陣列的方法為:

先從陣列右邊找到乙個比樞軸元素小的元素,將陣列的第乙個位置賦值為該元素;

再從陣列的左邊找到乙個比樞軸元素大的元素,將從上面取元素的位置賦值為該值;

依次進行,直到左右相遇,把樞軸元素賦值到相遇位置。

輸入陣列 arr 為 [39 , 28 , 55 , 87 , 66 , 3 ,17 ,39*],為了區別兩個相同元素,將最後乙個加上 *。

排序全過程:

:"""快速排序"""

iflen

(arr)

<2:

return arr

mid = arr[

len(arr)//2

]# 選取基準,隨便選哪個都可以,選中間的便於理解

left, right =

,# 定義基準值左右兩個數列

arr.remove(mid)

# 從原始陣列中移除基準值

for item in arr:

# 大於基準值放右邊

if item >= mid:

else

:# 小於基準值放左邊

# 使用迭代進行比較

return quick_sort(left)

+[mid]

+ quick_sort(right)

if __name__ ==

"__main__"

: arr =[1

,5,10

,456,23

,9,7

,2]print

(quick_sort(arr)

)

def

quicksort

(arr):if

len(arr)

<=1:

#不用進行排序

return arr

pivot = arr[

len(arr)//2

]

left =

[x for x in arr if x < pivot]

middle =

[x for x in arr if x == pivot]

right =

[x for x in arr if x > pivot]

return quicksort(left)

+ middle + quicksort(right)

if __name__ ==

"__main__"

: arr =[1

,5,10

,456,23

,9,7

,2]print

(quicksort(arr)

)

理想的情況每次劃分所選擇的中軸元素恰好將當前序列幾乎等分,經過log⁡2

n\log _ n

log2​n

趟劃分,便可以排序完畢。這樣,所以理想狀態下整個演算法的時間複雜度為o(n

log⁡2n

)o\left(n \log _ n\right)

o(nlog2​

n)。最壞的情況

每次所選的中間數是當前序列中的最值元素,這時每次劃分的兩個子表乙個長度是0,乙個是當前陣列長度減去1。這樣的話,長度為n的陣列需要經過n趟劃分,這時的時間複雜度為o(n

2)o\left(n^\right)

o(n2)。

為改善最壞情況下的時間效能,可以在最樞軸元素的原則中進行優化,選第乙個元素,最後乙個元素,中間元素中的中位數即可。這時快速排序的時間複雜度即為o

(nlog⁡2

n)o\left(\operatorname_ n\right)

o(nlog

2​n)

。不穩定

排序演算法(2)快速排序

採用分治思想 1 從序列中挑出乙個元素作為 基準 privot 2 把所有比基準小的元素放在基準前面,把所有比基準大的元素放在基準後面,這個操作稱為 分割槽 3 對每個分割槽遞迴的進行 1 2 遞迴結束的條件是序列的大小是0或1 分類 內部比較排序 資料結構 陣列 最差時間複雜度 每次選取的基準都是...

快速排序演算法2

package com.mianshi describe 快速排序演算法2 排序結果從小到大 create on 2011 05 25 author sylor.liu version 1.0 since jdk1.6 public class quicksort2 對資料進行快速排序 privat...

快速排序2(演算法)

快速排序 1.核心思想 2.思路 3.模板 4.例題 1.核心思想 分治 分治 字面上的解釋是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併,這個技巧是很多高效演算法的基礎。2.思路 1 ...