快速排序是筆試和麪試中很常見的一個考點。
快速排序是冒泡排序的升級版,時間複雜度比冒泡排序要小得多。除此以外,快速排序是不穩定的,冒泡排序是穩定的。javascript
(1)在數據集之中,選擇一個元素做爲"基準"(pivot)。
(2)全部小於"基準"的元素,都移到"基準"的左邊;全部大於"基準"的元素,都移到"基準"的右邊。
(3)對"基準"左邊和右邊的兩個子集,不斷重複第一步和第二步,直到全部子集只剩下一個元素爲止。
注:此處參考了阮一峯老師的文章。html
(1)基準是能夠任選的,能夠從一個數組的開頭選,也能夠從中間選,固然也能夠從最後選。總之,任意選均可以。我的認爲將數組開頭的元素做爲基準比較容易理解。
(2)「二分法」的思想,也就是「分而治之」。
(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 }
原始數組:[2,4,1,3]面試
第1次: [1, 2, 4, 3]
第2次: [1, 2, 3, 4]
最終結果:[1, 2, 3, 4]數組
快速排序採用了「二分法」的思想,採用遞歸實現。相比冒泡排序,時間複雜度要小不少。ide