快排演算法及常見兩種常見優化方法

2021-07-29 23:57:31 字數 1578 閱讀 2926

最近在找實習,然而我覺得部落格還是要堅持日更,我相信時間總是擠出來的,不扯淡了,快排這是個面試常考題,今天主要著重於講他的優化方法,那我就直接先貼快排**,再來細細道來我所知道的優化方法,正常的快排,先上後上**,比較容易理解

時間複雜度最快平均是o(nlogn),最慢的時候是o(n2);輔助空間也是o(logn);最開始學快排時最疑惑的就是這個東西不知道怎麼得來的,一種是通過數**算可以的出來,還有一種是通過遞迴樹來理解就容易多了

這張別人部落格那裡弄過來的,所謂時間複雜度最理想的就是取到中位數情況,那麼遞迴樹就是乙個完全二叉樹,那麼樹的深度也就是最低為logn,這個時候每一次又需要n次比較,所以時間複雜度nlogn,當快排為順序或者逆序時,這個數為乙個斜二叉樹,深度為n,同樣每次需要n次比較,那那麼最壞需要n2的時間

第一種優化方法,於插入排序相結合,在小陣列的情況下,快排比較慢,因為遞迴sort會出現呼叫自己情況,所以

//sort裡面這句

if(start>=end) return;

//換成下面這句

if(start>=end+m)

insertion.sort(a,start,end);//直接將這部分排序用插入排序來完成

return;

第二種就是三向切分,主要用於具有大量重複資料的情況,可以大大提高效率,因為正常的快排會出現同樣會把這些數進行遞迴,

public

void

sort(comparable a,int lo,int hi)

private

intpartition(comparable a, int lo, int hi)

swap(a,lo,j);

return j;

}private

void

swap(comparable a, int i, int j)

三向切分示意圖和切分軌跡圖,**對照著圖來看,相信聰明的你很快就可以理解

以上的圖主要來自與演算法第四版,原始碼位址[原始碼位址],(

快排的兩種寫法

快速排序,原理很簡單就是在資料找乙個定點數,把小於這個數的數放到其左邊,大於這個定點數的數放到其右邊,再把左邊的數,右邊的數再按這種方式來排序,直至無數可排.先實現,不求空間消耗,把小於定點的數放乙個陣列 b,把大於定點的數的放乙個陣列 c,再把它們拷回陣列 a int quick sort int...

我的小快排(兩種分割方法)

今天看到微博上有人轉一篇文章,題目是 你問什麼寫不好快排 看看自己多長時間能把快排寫出來。結果,果然20分鐘沒寫出來,本來以為明白原理,結果實現的出現各種問題,小 bug。最終花了半個點,寫出來了,就是下面 中 partition版本的。後來又翻了下演算法導論,看到上面的快排,寫了第二個分割子函式 ...

快排的兩種partition函式

partition函式就是快排的關鍵部分,作用是將陣列劃分成兩部分,左邊小於基數,右邊大於基數 但實際上它也不僅僅用於快排,在求top k 問題中也常常會用到。下面介紹兩種partition函式,他們都是雙指標的方法,但具體會有差異 函式一 頭尾指標向中間夾 def partition array,...