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

2022-02-24 23:13:50 字數 1136 閱讀 6696

今天看到微博上有人轉一篇文章,題目是《你問什麼寫不好快排》,看看自己多長時間能把快排寫出來。結果,果然20分鐘沒寫出來,本來以為明白原理,結果實現的出現各種問題,小 bug。最終花了半個點,寫出來了,就是下面**中 partition版本的。後來又翻了下演算法導論,看到上面的快排,寫了第二個分割子函式 partition2,這個原理更加清楚,用的是乙個迴圈不變式的原理,將陣列劃分為了四個區域,具體說明可以參照演算法導論。下面貼下**,自己mark 一下。

演算法導論上partition過程的偽**如下

partition(a,p,r)

x <- a[r]

i <- p - 1

for j <- p to r - 1

do if a[j] <= x

then i <- i +1

exchange a[i] <-> a[j]

exchange a[i+1] <-> a[r]

return i+1

對於迴圈的每一輪迭代的開始,對於任何陣列下標k,有

1)  如果 p <= k <= i,則 a[k] <= x

2)  如果 i + 1 <= k <= j - 1,則a[k] > x

3) 如果k = r,則 a[k] = x

package com.deron.business;

/** * this is quick sort tool class

* * @author deron

* */

public class qsort

public static void qsort(int array, int start, int end)

} public static int partition(int array, int start, int end)

} if (array[lp] <= array[t]) else

return t; }

public static int partition2(int array, int start, int end)

} array[start] = array[lp];

array[lp]= v;

return lp;

}}

快排的兩種寫法

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

快排的兩種partition函式

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

排序 快排的兩種寫法

之前的部落格記錄過各種排序 快排演算法 如下,該方法思路很直接也很清晰,但是在生成left和right時會需要新的空間,所以其空間複雜度要高一些。def quick sort li if len li 2 return li tmp li 0 快排中將序列分為左右的值 left x for x in...