1. 程式人生 > >一種簡單的用java實現快速排序(Quicksort)

一種簡單的用java實現快速排序(Quicksort)

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²),這也是為什麼最開始說,資料越亂越好的原因。