快速排序 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).
快排並不穩定