Python演算法入門 第3章 3 2 快速排序

2021-08-31 21:31:29 字數 1484 閱讀 7909

所謂快速排序,顧名思義,就是一種速度較快的排序方法,是一種常用的排序演算法。快速排序基於 d&c 策略(分而治之)即不斷把問題細分、化整為零從而把難以處理的大問題變成小問題來處理。乙個非常經典的案例就是秦國一統六國,採用遠交近攻分而治之的策略。當你不能把眼前的問題解決的時候,你就可以採用分而治之的策略,不斷地化整為零,直到變成你能處理的規模。假如說,你頑固的老丈人不同意你與你女朋友的婚事,也許你嘗試去討好他,但是收效甚微。那麼你就應該轉換方向,轉而去討好你丈母娘(雖然說丈母娘才是最難對付的乙個,這裡就讓我們假設丈母娘通情達理),你未來的小舅子。等你做好了她們的工作之後,我相信你老丈人會動搖的。如果你是屬於那種 「房子一扒,帕拉梅拉」 的壕級朋友,那麼請你忽略這種方法。

那麼現在就來講一下快速排序的原理。假如給定陣列 [ 3,2,6,9,1,5] 要我們對其進行排序,當然我們可以選用python自帶的sorted函式直接一步到位,但我們現在講的是分而治之的策略,既然講策略,你就當沒有sorted這個函式。

1,首先,我們從列表裡面隨機抓出乙個幸運數字來當哨兵。那麼本次我們就選擇數字3 。槍打出頭鳥嘛

2,將大於數字 3 的全部放到3 的右邊,小於數字 3 的放到 3 的左邊。那麼陣列就會變成 [2,1,3,6,9,5] 

3,接著對左邊的陣列 [2,1] 重複步驟二,對右邊的陣列重複步驟二,那麼就會得到 [1,2] ,[3],[5,6,9],這樣我們就成功地將陣列排序了。接下來將陣列進行合併就可以了。

我們在進行步驟 3 的時候實際上是在重複步驟 2 ,那麼我們使用遞迴不斷呼叫步驟 2 即可。上**:

def solution(arry_list):

'''利用分而治之的方法,通過遞迴呼叫,來實現快速排序

:param arry_list:給定乙個無序陣列

:return:返回排順序的陣列

'''#如果陣列只有乙個數字或者為空列表,那麼直接就返回原列表即可。同時這是結束遞迴呼叫的條件

if len(arry_list) < 2:

return arry_list

#如果列表元素大於1個,那麼就進行遞迴呼叫

else:

#設定陣列的第乙個數字為哨兵

guard = arry_list[0]

#利用列表生成器,如果列表裡面的數小於哨兵就放進less_than

less_than = [ i for i in arry_list[1:] if i <= guard]

#利用列表生成器,如果列表裡面的數大於哨兵就放進greater_than

greater_than = [ i for i in arry_list[1:] if i > guard]

#不斷遞迴呼叫函式本身

return solution(less_than) + [guard] + solution(greater_than)

#主函式

if __name__ == "__main__":

print(solution([2,3,6,1,4,7,5]))

Python演算法入門 第1章 3,去重排序

去掉重複的數字,並且將剩餘的數字進行從大到小的排序,python 如下 class solution 去除重複數字 從大到小排序 def maopao self,x 用集合去重,最後用sorted排序,再用 1 倒序處理 a i for i in set x return sorted a 1 if...

python入門 第8章 切片

1 對list進行切片 小結如下 切面最多可以有三個引數,引數之間使用 來分開,如果第乙個引數不寫,表示從第乙個元素開始,如果第二個引數不寫,表示到最後乙個元素 如果第乙個引數和第二個引數都寫了,那麼取值的時候從索引為第乙個引數開始,到第二個引數索引之間取值,不包含第二個索引對應的值 如果第三個引數...

Python入門 第8章 函式

此系列文章的創作初衷是作為讀書過程中的筆記,而非教程類文章。def greet print hello def greetuser name print hello,name.title def greet 顯示簡單的問候語 print hello 乙個良好的 編寫習慣是,在每個函式頭後都用文件字串...