快速排序的實現同樣使用分治法,它的原理是從序列中選擇乙個值作為基準值,然後分成比基準值小的序列集合和比基準值小的序列集合和與基準值相等的序列集合。
再將比基準值小的序列集合和比基準值小的序列集合再次進行選擇基準值分割,最後再從下到上每層按照順序合併即可。
如圖:
每次分割都是以序列中的第乙個值作為基準值,經過拆分後自然就變成了有順序的
def
quick_sort
(s):
"""快速排序,s為列表"""
# 結束條件
iflen
(s)<2:
return
# 從列表取出乙個元素作為基準值
p = s[0]
l =# 小於
e =# 等於
r =# 大於
# 把s裡的元素放入3個佇列
while
len(s)
>0:
if s[-1
]< p:))
elif s[-1
]== p:))
else:)
) quick_sort(l)
quick_sort(r)
s.extend(l)
s.extend(e)
s.extend(r)
if __name__ ==
'__main__'
: s =[1
,7,3
,5,4
] quick_sort(s)
print
(s)
**中實現的是列表的快速排序,類似的也可以實現其他型別序列的排序
快速排序的時間複雜度有最優情況與最壞情況
最優情況為每一次的基準值都正好為序列的中位數,時間複雜度為nlog(n)
最壞情況為每一次的基準值都恰好是序列的最大值或最小值,時間複雜度為n^2。有意思的是如果每次選第乙個數做基準值,但每次這個數又是最小值,那麼序列本身就是有序的,但時間複雜度也是最高的
要想要想優化時間複雜度,基準值的選擇很關鍵,可以使用類似的從序列中選幾個數,再求出他們的中位數做基準值
上面的快排使用了l,e,r儲存臨時的序列,這樣會占用記憶體,使用就地快速排序的方式可以在原序列上完成排序,減少了記憶體的使用
def
inplace_quick_sort
(s,a,b)
:"""列表的就地快速排序,s為列表,a為起始索引,b為終止索引"""
if a >= b:
return
# s[b]作為基準值
p = s[b]
# left和right相當於指向
left = a
right = b-
1# 把除了s[b]d 其他元素按照以s[b]為基準分割
while left <= right:
while left <= right and s[left]
< p:
left +=
1while left <= right and p < s[right]
: right -=
1if left <= right:
s[left]
,s[right]
= s[right]
,s[left]
left,right = left+
1,right-
1 s[left]
,s[b]
= s[b]
,s[left]
inplace_quick_sort(s,a,left-1)
inplace_quick_sort(s,left+
1,b)
python實現快速排序
快速排序的思想是任意選取要排序的list中的乙個數pivot,每次遞迴時將list按照 小於pivot的,pivot,大於pivot的 排序,再對小於和大於pivot部分分別快速排序。function quicksort list select a pivot foreach x in list i...
Python實現快速排序
快速排序的思路 numlist 6,8,1,4,3,9,5,4,11,2,2,15,6 1 設 keys 又稱為監視哨 等於 numlist 0 i等於0 j等於len numlist 1,即如下 numlist 6,8,1,4,3,9,5,4,11,2,2,15,6 keys 6 i 0 j2 1...
python實現快速排序
coding utf 8 實現對列表中的數進行快速排序 importrandom 隨機生成乙個有1000整數的列表 number random.randint 1 1000 foriinrange 1000 列印原始列表 printnumber 單個列表快速排序函式 返回一次排序後的列表和所選取基數...