一種簡單的用java實現快速排序(Quicksort)
阿新 • • 發佈:2018-12-29
1,快速排序(Quicksort)是對氣泡排序的一種改進。對資料量越大,資料分佈越混亂的,一般認為是效能最好的。快排是分治思想的一種體現,把大的問題細化成小問題,把小問題細化成更小的問題,最終把問題縮小到一定規模內,可解決。
2,快排演算法思路就是,先取一個數作為關鍵資料(key一般取陣列第一個數字),一輪排序的結果就是,大於key和小於key的資料分成兩部分,再分別對這兩部分‘分而治之’,最終得到一個排好序的資料。下面貼出程式碼(從小到大排序):
public static int[] sortQuick(int[] in, int left, int right){
int key = in[left]; //選定陣列第一個數字作為key
int start = left;
int end = right;
while(start<end){
//從右向左遍歷,找到小於key的,放入下標strat中。
while(start < end && key<=in[end]){
end--;
}
in[start] = in[end];
//從左向右遍歷,找到大於key的,放入下標end中。
while(start < end && key > in[start]){
start++;
}
in[end] = in[start];
}
//此時start==end,這就是所謂的軸,把key放入軸中,軸左邊的都<key,軸右邊的都>key
in[start] = key;
//此時大家想象一下,軸在陣列中間,說明把陣列分成兩部分,此時要對這兩部分分別進行快排。
if(start>left)sortQuick(in,left,start -1);
if(end<right)sortQuick(in, end+1, right);
return in;
}
3.時間複雜度O(nlogn)
先貼出百度百科的介紹快速排序演算法
這裡只說一下最壞的情況,就是針對一個已經基本排好序的陣列進行快排,這樣會導致每次分治的兩部分的複雜度,一個為O(1),一個為O(n),所以最終得到的整體時間複雜度對O(n²),這也是為什麼最開始說,資料越亂越好的原因。