快速排序算法

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

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

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

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

 

 
posted @ 2019-07-16 23:45  别动我的猫  阅读(3870)  评论(0编辑  收藏  举报