快速排序是一種常用的排序算法,比選擇排序快很多。
在快速排序中使用了大量的遞歸,快速排序的三個步驟:
1、選擇基准值
2、將數組分成兩個子數組;小於基准值的元素和大於基准值的元素
3、對這兩個子數組進行快速排序(遞歸)
快速排序的速度取決於選擇的基准值,運行速度記做 O(n longn ),大O表示法底數默認為2
這張圖釋權的很好。
Java實現(僅供參考,運行沒毛病)
package sort.quickSort; import java.util.Arrays; /** * @Auther: lanhaifeng * @Date: 2019/7/20 0020 14:54 * @Description: 快速排序算法 */ public class QuickSort { /** * 快速排序(遞歸) * ①. 從數列中挑出一個元素,稱為"基准"(pivot)。 * ②. 重新排序數列,所有比基准值小的元素擺放在基准前面,所有比基准值大的元素擺在基准后面(相同的數可以到任一邊)。在這個分區結束之后,該基准就處於數列的中間位置。這個稱為分區(partition)操作。 * ③. 遞歸地(recursively)把小於基准值元素的子數列和大於基准值元素的子數列排序。 * @param arr 待排序數組 * @param left 左邊界 0 * @param right 右邊界 數組長度-1 */ public void quickSort(int[] arr, int left, int right){ int l = left; int h = right; int k = arr[left]; while (l < h) { // 從后往前比較 while (l < h && arr[h] >= k) { // 如果沒有比關鍵值小的,比較下一個,直到有比關鍵值小的交換位置,然后又從前往后比較 h--;// h=6 } if (l < h) { int temp = arr[h]; arr[h] = arr[l]; arr[l] = temp; //進行過一次替換后,沒必要將替換后的兩值再次比較,所以i++直接下一位與k對比 l++; } // 從前往后比較 while (l < h && arr[l] <= k) { // 如果沒有比關鍵值大的,比較下一個,直到有比關鍵值大的交換位置 l++; } if (l < h) { int temp = arr[h]; arr[h] = arr[l]; arr[l] = temp; h--; } // 此時第一次循環比較結束,關鍵值的位置已經確定了。左邊的值都比關鍵值小,右邊的值都比關鍵值大,但是兩邊的順序還有可能是不一樣的,進行下面的遞歸調用 } print(arr,k); System.out.print("l=" + (l + 1) + "h=" + (h + 1) + "k=" + k + "\n"); // 遞歸 if (l > left){ //先判斷l>low再次經行左邊排序 quickSort(arr, left, l - 1);// 左邊序列。第一個索引位置到關鍵值索引-1 } if (h < right){ //左邊依次排序執行完遞歸后,彈棧進行右邊排序 quickSort(arr, l + 1, right);// 右邊序列。從關鍵值索引+1到最后一個 } } // 打印數組的方法 private static void print(int[] arr,int base) { System.out.print("["); for (int i = 0; i < arr.length; i++) { if(arr[i]==base && i != (arr.length - 1)){ System.out.print("<"+arr[i] + ">,"); } else if (i != (arr.length - 1) && arr[i]!=base) { System.out.print(arr[i] + ","); } else { System.out.print(arr[i] + "]"); System.out.println(); } } } }
打印結果
"C:\Program Files (x86)\Java\jdk1.8.0_131\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.2.5\lib\idea_rt.jar=10509:C:\Program Files\JetBrains\IntelliJ IDEA 2017.2.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-32.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files (x86)\Java\jdk1.8.0_131\jre\lib\rt.jar;F:\testJava\testArraySort\out\production\testArraySort" sort.quickSort.Main [1,2,<3>,4,13,5,7,8,15,14,11,12,6,10,9] l=3h=3k=3 [<1>,2,3,4,13,5,7,8,15,14,11,12,6,10,9] l=1h=1k=1 [1,<2>,3,4,13,5,7,8,15,14,11,12,6,10,9] l=2h=2k=2 [1,2,3,<4>,13,5,7,8,15,14,11,12,6,10,9] l=4h=4k=4 [1,2,3,4,9,5,7,8,10,6,11,12,<13>,14,15] l=13h=13k=13 [1,2,3,4,6,5,7,8,<9>,10,11,12,13,14,15] l=9h=9k=9 [1,2,3,4,5,<6>,7,8,9,10,11,12,13,14,15] l=6h=6k=6 [1,2,3,4,<5>,6,7,8,9,10,11,12,13,14,15] l=5h=5k=5 [1,2,3,4,5,6,<7>,8,9,10,11,12,13,14,15] l=7h=7k=7 [1,2,3,4,5,6,7,<8>,9,10,11,12,13,14,15] l=8h=8k=8 [1,2,3,4,5,6,7,8,9,<10>,11,12,13,14,15] l=10h=10k=10 [1,2,3,4,5,6,7,8,9,10,<11>,12,13,14,15] l=11h=11k=11 [1,2,3,4,5,6,7,8,9,10,11,<12>,13,14,15] l=12h=12k=12 [1,2,3,4,5,6,7,8,9,10,11,12,13,<14>,15] l=14h=14k=14 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] l=15h=15k=15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Process finished with exit code 0
當然這個寫法有點勉強,也沒看到什么好的,先這樣理解吧!