因為有一個先入為主的概念:快速排序最牛。因此剛開始一聽見快速 排序就不敢寫,認為其絕對很復雜。
事實證明這種想法不能有!
簡單粗暴地使用遞歸手寫快速排序:
(為了面試時候能不怯場的直接手撕)
# 簡單粗暴的快速排序
# 存在額外的開銷存放左右
# 要多次遍歷數組
def quicksort(array): # 直接遞歸
if len(array)<2: # 遞歸出口
return array
pivot_index = 0
pivot = array[pivot_index]
left_arr = [i for i in array[pivot_index+1:] if i<=pivot]
right_arr = [i for i in array[pivot_index+1:] if i>pivot]
return quicksort(left_arr) + [pivot] + quicksort(right_arr)
# 測試
import random
# seq = list(range(10))
# random.shuffle(seq)
seq = [random.randint(1,100) for i in range(10)]
print(seq)
quicksort(seq)
輸出:?
[4, 77, 14, 14, 33, 69, 63, 67, 87, 9]
[4, 9, 14, 14, 33, 63, 67, 69, 77, 87]
改進:
上述算法存在很多問題,已經寫在注釋里。因此考慮不創建額外數組的改進:
思路概述:
- 以第一個元素作為pivot,left指針指向第二個元素,right指針指向最后一個元素。
- 如果left指向的元素小于pivot,則left指針+1(即后移一個元素),接著判斷,如果該元素大于pivot,left指針停止移動。
- 如果right指向的元素大于pivot,則right指針-1(即前移一個元素),接著判斷,如果該元素小于pivot,right指針停止移動。
- 判斷left是否大于right,是就跳出
- 交換left和right所指向的元素。
- 返回步驟2.
- 跳出后,交換right所指和pivot所在位置的值。
# 改進,不產生多余的開銷
# 在原數組上用左右指針
def partition(array,beg,end): # pivot左邊的都比pivot小,右邊的都比pivot大
pivot_index = beg
pivot = array[pivot_index]
left = pivot_index+1
right = end
while True:
while left<=right and array[left]<=pivot:
left += 1
while left<=right and array[right]>pivot:
right -=1
if left>right:
break
else:
array[left],array[right] = array[right],array[left]
array[right],array[pivot_index] = array[pivot_index],array[right]
return right # 返回pivot的下標
def quicksort_pro(array,beg,end): # 改進后的快速排序
if beg < end :
pivot = partition(array,beg,end)
quicksort_pro(array,beg,pivot)
quicksort_pro(array,pivot+1,end)
# 測試
import random
# seq = list(range(10))
# random.shuffle(seq)
seq = [random.randint(1,100) for i in range(6)]
print(seq)
quicksort_pro(seq,0,len(seq)-1)
print(seq)
以上。
參考:
https://www.bilibili.com/video/av26524049
https://www.bilibili.com/video/av26524633/?spm_id_from=trigger_reload
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
