1. 程式人生 > >快速排序 java詳解

快速排序 java詳解

1.快速排序簡介:

  快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列

2.快速排序原理:

  a.先選一個基準值(key),一般選取序列第一個數作為基準值。假設最右邊的索引為J,最左邊的索引為i.

  b.先從右往左比較,(進行j--)直到找到第一個比key小的數,然後把他與key進行交換。

  c.在從左往右比較,(進行i++)直到找到第一個比key大的數,然後把他與key進行交換。

  d.直到i==j,結束第一次迴圈。此時,key左邊的數都比key小,key右邊的數都比key大,原序列被分為兩個子序列。

  e.遞迴。將這兩個子序列在重複上面a,b,c,d四個步驟。

3.java程式碼實現

package harbin;

import java.util.Scanner;

public class QSort{
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.println(
"請輸入要進行排序的數列的長度: "); int n = sc.nextInt(); int [] a = new int[n]; System.out.println("請輸入要進行排序的數列: "); for(int i=0;i<n;i++){ a[i] = sc.nextInt(); } int x = 0; int y = a.length-1; QSort.QuickSort(a,x,y); for
(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } } public static void QuickSort(int[] a,int start,int end){ int left = start; int right = end; int key = a[start]; while(left<right){ while(left<right&&a[right]>=key){//從後向前尋找第一個比key小的值 right--; } if(a[right]<=key){ int temp = a[left]; a[left] = a[right]; a[right] = temp; } while(left<right&&a[left]<=key){//從前向後尋找第一個比key大的值 left++; } if(a[left]>=key){ int temp = a[left]; a[left] = a[right]; a[right] = temp; } } if(left>start){ QuickSort(a,start,left-1); } if(right<end){ QuickSort(a,right+1,end); } } }

4.例子:

 

5.解釋:

原序列為:49 38 66 97 39 68 

a.選取基準值為49,i=0, j=5;

b.從右向左找第一個比49小的數,發現j=4時,39<49,所以將39和49進行交換得到序列:39 38 66 97 49 68;

c.再從左向右找第一個比49大的數,發現i=2時,66>49,將66和49進行交換得到序列:39 38 49 97 66 68;

d.在重複2,3步驟得到序列為:(39 38)49 (97 66 68)基準值左邊的數都比基準值小,右邊的都比基準值大

e.在對左右兩個子序列重複以上4步。得到38 39 49 66 68 97

 

6.說明:

快排被公認為在所有同數量級O(nlogn)的排序方法中,平均效能最好,但如果原序列為有序序列時,快排將蛻化為氣泡排序,其時間複雜度為O(n2).

快排並不穩定