快排 Python實現

2021-09-26 07:41:37 字數 2987 閱讀 2690

同氣泡排序(上篇博文)一樣,快速排序也屬於交換排序,通過元素之間的比較交換位置來達到排序的目的。

不同的是,氣泡排序在每一輪中只是把1個元素冒泡到陣列的一端,而快速排序是:每一輪挑選乙個基準元素,讓比基準元素大的元素移動到陣列的一邊,比基準元素小的移動到陣列的另外一端,從而把陣列拆解成兩部分。

舉例說明一下,假設有如下的陣列:58

639第一輪:

1.設定基準元素:假設以第乙個元素5為基準元素58

6392.比較:藍色元素為比基準元素5大的元素,綠色的為比基準元素小的元素。58

6393.交換位置:預設公升序,比基準元素大的放左邊,比基準元素小的放右邊35

869第一輪分析:

第一輪以基準元素5為界,將陣列分為比5小的子集(a),和比5大的子集(b),所以接下來繼續按照這樣的步驟將a、b兩部分子集排好就好了!!

子集a:3

基準元素:5

子集b:8

69第二輪:

由於子集a只有乙個元素,不用再排序了,子集b有三個元素,接著用上面的步驟排序:

1.設定基準元素:假設以第乙個元素8為基準元素86

92.比較:藍色元素為比基準元素8大的元素,綠色的為比基準元素小的元素。86

93.交換位置:預設公升序,比基準元素大的放左邊,比基準元素小的放右邊68

9第二輪分析:

由於子集a只用乙個元素,不用再做排序,故第二輪主要是對子集b做排序,排序結果如上圖,子集b排序後,左右元素各乙個,也不用再做排序,故到此為止!!!

通過上面的舉例可以看出,快速排序採用的是分治法的思想,這種思想的好處是什麼呢?

假如我們有8個元素的陣列,如果用氣泡排序的話,需要比較7輪,每一輪的把乙個元素移動到陣列的一端,這樣的時間複雜度是o(n^2)。

而快排採用分治的思想,初始陣列在每一輪都被拆成兩部分,每一部分在下一輪又分別被拆成兩部分,直到不可拆為止,拆分方式就如二叉樹一般。

每一輪的比較和交換,需要把陣列的全部元素都遍歷一遍,時間複雜度是o(n),而大約需要logn輪(預設以2為底),因此快速排序演算法的平均時間複雜度是o(nlogn)

class

solution

:def

quick_sort

(self,data):if

len(data)

>=2:

# 如果陣列長度大於等於2,則進行比較

pivot = data[0]

# 選取第乙個元素為基準,當然隨機選取最好

left, right =

,[]# 定義基準值左右兩側的列表

data.remove(pivot)

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

for i in data:

# 遍歷

if i >= pivot:

# 大於基準值的元素,放進right陣列中

else

:

# 小於基準值的元素,放進left陣列中

return quick_sort(left)

+[pivot]

+ quick_sort(right)

# 遞迴

else

:return data

if __name__==

"__main__"

:#驗證

solution = solution(

)test =[5

,8,6

,3,9

,2,1

,7]solution.quick_sort(test )

輸出:[1,

2,3,

5,6,

7,8,

9]

按照演算法導論中的思想:

# 演算法導論裡的思想,i表示[l,i]都比pivot小的元素下標, j 依次遍歷元素

defquick_sort_other

(array, left, right)

:if left >= right:

return array

stack =

[left,right]

while stack:

low = stack.pop(0)

high = stack.pop(0)

if high <= low:

continue

pivot = array[high]

i = low -

1for j in

range

(low,high+1)

:if array[j]

<= pivot:

i +=

1 array[i]

,array[j]

= array[j]

,array[i]

stack.extend(

[low, i-

1, i +

1, high]

)return array

輸入:

array =[6

,1,4

,2,3

,9,5

]quick_sort_other(array,0,

len(array)-1

)輸出:[1

,2,3

,4,5

,6,9

]

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

快排是python經典演算法之一。1 下面講解的是什麼是快排和快排的圖示。2 快排是一種解決排序問題的運算方法。3 快排的原理 在陣列中任意選擇乙個數字作為基準,用陣列的資料和基準資料進行比較,比基準數字打的數字的基準數字的右邊,比基準數字小的數字在基準數字的左邊,第一次排序之後分為比基準資料大或比...

python實現快排

學習python,隨便寫了下快排,如下 coding utf 8 快速排序演算法實現 import sys sys.setrecursionlimit 1000000 設定最大遞迴深度,這裡設定為一百萬 def kuaipai ii,jj,data list global s s 1 記錄遞迴的深度...

Python 實現快排 堆排

原理 公升序 選取陣列的首個元素做為中間值,快取這個中間值,該位置變為空 從右到左和中間值對比,找到第乙個小於中間值的元素,把該值放到左邊的空位,該位置變為空 從左到右和中間值對比,找到第乙個大於中間值的元素,把該值放到右邊的空位,該位置變為空 重複步驟2和3,直到左右空位相交,然後把快取的中間值填...