快速排序算法


快速排序是一种常用的排序算法,比选择排序快很多。

在快速排序中使用了大量的递归,快速排序的三个步骤:

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

当然这个写法有点勉强,也没看到什么好的,先这样理解吧!

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM