同氣泡排序(上篇博文)一樣,快速排序也屬於交換排序,通過元素之間的比較與交換位置來達到排序的目的。
不同的是,氣泡排序在每一輪中只是把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,直到左右空位相交,然後把快取的中間值填...