快速排序的一種Java實現

快速排序是筆試和麪試中很常見的一個考點。
快速排序是冒泡排序的升級版,時間複雜度比冒泡排序要小得多。除此以外,快速排序是不穩定的,冒泡排序是穩定的。javascript

1.原理

(1)在數據集之中,選擇一個元素做爲"基準"(pivot)。
(2)全部小於"基準"的元素,都移到"基準"的左邊;全部大於"基準"的元素,都移到"基準"的右邊。
(3)對"基準"左邊和右邊的兩個子集,不斷重複第一步和第二步,直到全部子集只剩下一個元素爲止。
注:此處參考了阮一峯老師的文章html

2.對原理的解讀

(1)基準是能夠任選的,能夠從一個數組的開頭選,也能夠從中間選,固然也能夠從最後選。總之,任意選均可以。我的認爲將數組開頭的元素做爲基準比較容易理解。
(2)「二分法」的思想,也就是「分而治之」。
(3)採用遞歸實現。java

3.Java實現

 1 package com.primeton.sort;
 2 
 3 import java.util.Arrays;
 4 /**
 5  * 快速排序類
 6  * @author Chen
 7  *
 8  */
 9 public class QuickSort {
10 
11     private static int num = 0;    //比較次數,在顯示方法中使用
12     
13     /**
14      * 每輪排序結束後都顯示一次
15      * @param a 
16      */
17     public static void show(int[] a){
18         num++;
19         System.out.println("第"+num+"次: "+Arrays.toString(a));
20     }
21     
22     /**
23      * 重載
24      * @param a
25      */
26     public static void quickSort(int[] a){
27         quickSort(a,0,a.length-1);
28     }
29     
30     /**
31      * 快速排序
32      * @param a
33      * @param base        基準點
34      * @param arrEle    數組元素
35      */
36     public static void quickSort(int[] a,int base,int arrEle){
37         int i, j;  
38         i = base;  
39         j = arrEle;
40         
41         if ((a == null) || (a.length == 0)){
42             return;  
43         }
44         if(base<0 || arrEle < 0 || arrEle<base){
45             return;
46         }
47           
48         while (i < j) {//查找基準點下標  
49             while (i < j && a[i] <= a[j]){ // 以數組下標base的數據爲基準,從右側開始掃描
50                 j--;  
51             }
52             if (i < j) { // 右側掃描,找出第一個比base小的,交換位置  
53                 int temp = a[i];  
54                 a[i] = a[j];  
55                 a[j] = temp;  
56             }  
57             while (i < j && a[i] < a[j]){  // 左側掃描(此時a[j]中存儲着base值)
58                 i++; 
59             }
60             if (i < j) { // 找出第一個比base大的,交換位置  
61                 int temp = a[i];  
62                 a[i] = a[j];  
63                 a[j] = temp;  
64             }  
65         }  
66         show(a);
67         
68         if (i - base > 1) { // 遞歸調用,把base前面的完成排序  
69             quickSort(a, 0, i - 1);  
70         }  
71         if (arrEle - j > 1) {  
72             quickSort(a, j + 1, arrEle); // 遞歸調用,把base後面的完成排序  
73         }  
74         
75     }
76     
77     /**
78      * @param args
79      */
80     public static void main(String[] args) {
81         // TODO Auto-generated method stub
82         int[] a={2,4,1,3};
83         QuickSort.quickSort(a);
84         System.out.println("最終結果:"+Arrays.toString(a));
85     }
86 
87 }
快速排序

4.結果

      原始數組:[2,4,1,3]面試

第1次: [1, 2, 4, 3]
第2次: [1, 2, 3, 4]
最終結果:[1, 2, 3, 4]數組

5.總結

快速排序採用了「二分法」的思想,採用遞歸實現。相比冒泡排序,時間複雜度要小不少。ide

相關文章
相關標籤/搜索