zoukankan      html  css  js  c++  java
  • 快速排序算法

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

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

    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 + "
    ");
            // 递归
            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)Javajdk1.8.0_131injava" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2017.2.5libidea_rt.jar=10509:C:Program FilesJetBrainsIntelliJ IDEA 2017.2.5in" -Dfile.encoding=UTF-8 -classpath "C:Program Files (x86)Javajdk1.8.0_131jrelibcharsets.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibdeploy.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextaccess-bridge-32.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextcldrdata.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextdnsns.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextjaccess.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextjfxrt.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextlocaledata.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibext
    ashorn.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextsunec.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextsunjce_provider.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextsunmscapi.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextsunpkcs11.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibextzipfs.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibjavaws.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibjce.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibjfr.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibjfxswt.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibjsse.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibmanagement-agent.jar;C:Program Files (x86)Javajdk1.8.0_131jrelibplugin.jar;C:Program Files (x86)Javajdk1.8.0_131jrelib
    esources.jar;C:Program Files (x86)Javajdk1.8.0_131jrelib
    t.jar;F:	estJava	estArraySortoutproduction	estArraySort" 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

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

     
  • 相关阅读:
    洛谷 P3138 [USACO16FEB]Load Balancing S(二维前缀和,离散化)
    洛谷 P1052 [NOIP2005 提高组] 过河(dp,数学)
    洛谷 P1955 [NOI2015] 程序自动分析(并查集,离散化)
    洛谷 P3258 [JLOI2014]松鼠的新家(树上差分,lca)
    洛谷 P2296 [NOIP2014 提高组] 寻找道路(反图bfs)
    洛谷 P4141 消失之物(dp方案数)
    洛谷 P5322 [BJOI2019]排兵布阵(dp,分组背包)
    回溯算法
    分治法
    分支限界法
  • 原文地址:https://www.cnblogs.com/zeussbook/p/11198360.html
Copyright © 2011-2022 走看看