快速排序是一种常用的排序算法,比选择排序快很多。
在快速排序中使用了大量的递归,快速排序的三个步骤:
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
当然这个写法有点勉强,也没看到什么好的,先这样理解吧!