1. 程式人生 > >java 實現 常見排序演算法(三)快速排序

java 實現 常見排序演算法(三)快速排序

大家好,我是烤鴨:    

   今天分享一下基礎排序演算法之快速排序。快速排序是內部排序(基於比較排序)中最好的比較演算法。

 

1.     快速排序:


原理:在要排的數(比如陣列A)中選擇一箇中心值key(比如A[0]),通過一趟排序將陣列A分成兩部分,其中以key為中心,key右邊都比key大,key左邊的都key小,然後對這兩部分分別重複這個過程,直到整個有序。
        整個快排的過程就簡化為了一趟排序的過程,然後遞迴呼叫就行了。

思路:

1,定義i=0,j=A.lenght-1,i為第一個數的下標,j為最後一個數下標
2,從陣列的最後一個數Aj從右往左找,找到第一小於key的數,記為Aj;
3,從陣列的第一個數Ai 從左往右找,找到第一個大於key的數,記為Ai;
4,交換Ai 和Aj 
5,重複這個過程,直到 i=j
6,調整key的位置,把A[i] 和key交換

  例如  6 9 8 5 4 7(i=0,j=0)
  first time: 4 9 8 5 6 7  從左向右,取>=6的(第一個為6),從右向左,取比6小的(第一個為4),交換位置(i=0,j=1)
  second time: 4 5
8 9 6 7 比6大的第二個元素9,比6小的第二個元素5,交換位置(i=1,j=2)   third time: 4 5 8 9 6 7 再繼續i > j了,遞迴原方法,45基準變成4,8967基準變成8(i=2,j=1)   forth time: 4 5 7 9 6 8  同上,8和7交換(i=2,j=5)   fifth time: 4 5 7 6 9 8  同上,9和6交換(i=3,j=4)   再同上 , 7和6交換。9和8交換。

程式碼實現:

public void quickSort(int[] numbers, int start, int end) {
        if (start < end) {
            int base = numbers[start];         // 選定的基準值(第一個數值作為基準值)
            int temp;                          // 記錄臨時中間值
            int i = start, j = end;
            do {
                while ((numbers[i] < base) && (i < end)) {
                    i++;
                }
                while ((numbers[j] > base) && (j > start)) {
                    j--;
                }
                if (i <= j) {
                    temp = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = temp;
                    i++;
                    j--;
                }
            } while (i <= j);
            if (start < j) {
                quickSort(numbers, start, j);
            }
            if (end > i) {
                quickSort(numbers, i, end);
            }
        }
    }

耗時對比:

10W 條隨機 資料 執行如圖:

分別對比了氣泡排序,直插排序,希爾排序和快速排序。差距很明顯。

50W 條隨機 資料 執行如圖:

分別對比了氣泡排序,直插排序,希爾排序和快速排序。差距很明顯。

100W 條隨機 資料 執行如圖:

分別對比了氣泡排序,直插排序,希爾排序和快速排序。差距很明顯。

總結:

快速排序(Quicksort)是對氣泡排序的一種改進。

最壞時間複雜度和插入排序相同:O(n^2)。

氣泡排序總的平均時間複雜度為:O(nlog2n) 。

各種排序方法比較:

 

更多排序演算法:

氣泡排序   :  https://blog.csdn.net/Angry_Mills/article/details/81057900

插入排序   :  https://blog.csdn.net/Angry_Mills/article/details/81208700