今天看到微博上有人轉一篇文章,題目是《你問什麼寫不好快排》,看看自己多長時間能把快排寫出來。結果,果然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...