用乙個下午終於學會別人十分鐘學會的快速排序

2021-10-10 18:55:09 字數 3362 閱讀 7261

別人十分鐘學一演算法,我一下午才勉勉強強學會了…

下面一篇是原理一篇是優化思想,看看人家,看看我,流下辣雞的淚水

[1].

[2].

本人使用遞迴方法實現快排,測試用例為[1,1,6,6,5,2,3]

1.def find(l,r):

2. if l>=r or r<0:

3. return

4. start, end = l, r

5. pivot = num[start]

6. while lpivot:

10. r -= 1

11. num[l], num[r] = num[r], num[l]

12. num[l], num[start] = num[start], num[l]

13. find(start,l-1)

14. find(l+1, end)

就,死迴圈了唄。自己按**的邏輯跑了一遍,發現是第乙個和第二個元素,兩個1無限的交換,導致了死迴圈。

恩!懂了,加個等號不就完事了嘛

在第7行加了乙個等號7.while l輸出:

不慌,繼續手推,發現是在第乙個遞迴的時候,第三個位置的元素6被擺放在第乙個位置。

經過十分鐘思考半小時發呆的認真研究與參考他人**,得到如下結果

問題發生在,左右指標之間|r-l|=1時,是讓右指標減一,還是左指標加一?

即是讓右指標迴圈在前還是左指標在前?

=> 答案是應該讓右指標在前,否則左指標在前,當兩指標指向同乙個位置時。基準在左側,其值大於基準,交換位置後,大值就在基準的左側,出錯。

該死的好奇心…

突然想到,那我等號又憑啥放在左指標,放在右指標上就不行嘛!

呵呵!

> input: [1, 1, 6, 6, 5, 2, 3]

真的別慌,反正都花了乙個多小時了,再手推看看發生什麼情況不就好了(這時候別問為啥不直接print輸出了,上頭了真的就沒想那麼多,乙個別人口中十分鐘的問題,我已經學了這麼久了,能堅持下來已經感天動地555)

通過手推,可以發現是在遞迴輸入引數為l=2,r=6時,在最後基準位置的元素是3,原來是基準被放在了最左邊(我說為啥有些人會寫乙個while迴圈把基準放兩邊),如果把等號放在右指標迴圈中,左指標會把基準元素考慮進去進行交換,於是發生了錯誤。

基於基準在第乙個元素的快速排序解決!

給乙個完整的程式吧

:測試用例可不是隨便找的哦!最小元素和最大元素可以放在最前邊進行快排可以快速地知道這些邊界是否出錯,恩…手推會方便很多啦!

import time

import random

num =[1

,1,6

,6,5

,2,3

]def

find

(l,r)

:if l>=r or r<0:

return

start, end = l, r

pivot = num[start]

while l

while l

> pivot:

r -=

1while l < r and num[l]

<= pivot:

l +=

1 num[l]

, num[r]

= num[r]

, num[l]

num[l]

, num[start]

= num[start]

, num[l]

find(start,l-1)

find(l+

1, end)

print

(num)

find(0,

len(num)-1

)print

(num)

其實還沒結束…如果在多想想,基準位置為什麼放在第乙個呢,我把它任意會發生什麼呢?

不多說啦,又花了半小時去摸索,基本要求是移動基準位置,保證基準放在左右兩邊(不一定是第乙個或者第二個元素,保證在交換過程中不會移動即可),基本原則仍然是上面的兩條。

def

find_base_random

(l,r)

:if l>=r:

return

start, end = l, r

index = random.randint(l,r)

#index=2

pivot = num[index]

while index

>=pivot:

r -=

1 num[index]

, num[r]

= num[r]

, num[index]

index = r

while l < r:

while l < r and num[l]

< pivot:

l +=

1while l < r and num[r]

>= pivot:

r -=

1 num[l]

, num[r]

= num[r]

, num[l]

num[l]

, num[index]

= num[index]

, num[l]

find_base_random(start, l -1)

find_base_random(l +

1, end)

當然有可能我的想法還有錯,如果錯了還請指正呢!

十分鐘學會less

譯者 wleonardo 我們都知道在大型的專案中,當css有數千行 的時候,css的編寫有一些麻煩。我們經常會出現複製相同的 到不同的地方或者通過我們的編輯器來替換所有相同的顏色。這需要我們費很大的力氣去保持css的可維護性。但是其實我們並不是一定要這樣。幸運的是,web開發社群已經解決了這個問題...

十分鐘學會Excel匯出

excel匯出在內網系統一般用的很多,一般分為poi和jxl兩種,前者支援excel2003 xls 和excel2007 xlsx 而後者只支援excel2003 xls 所以我們這裡使用poi來做excel 的匯出 我們以匯出員工資訊的資料為例子 第一步 匯入poi的jar包 第二步,在前台寫乙...

十分鐘一起學會Inception網路

作者 荔枝boy 編輯 安可 一 inception網路簡介 二 inception網路模組 三 inception網路降低引數計算量 四 inception網路減緩梯度消失現象 五 inception網路框架 六 inception 彩蛋 一 inception網路簡介 inception網路又叫...