• java排序算法之快速排序


    基本思想

    快速排序(QuickSort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:

    1. 从要排序的数据中取一个数为“基准数”。
    2. 通过一趟排序将要排序的数据分割成独立的两部分,其中左边的数据都比“基准数”小,右边的数据都比“基准数”大。
    3. 然后再按步骤2对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    该思想可以概括为:挖坑填数 + 分治法。

    快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。

    public class QuickSort {
        private static void quickSort(int[] array, int low, int high) {
            if (low >= high) {
                return;
            }
            int i = low, j = high, index = array[i]; // 取最左边的数作为基准数
            while (i < j) {
                while (i < j && array[j] >= index) { // 向左寻找第一个小于index的数
                    j--;
                }
                if (i < j) {
                    array[i++] = array[j]; // 将array[j]填入array[i],并将i向右移动
                }
                while (i < j && array[i] < index) {// 向右寻找第一个大于index的数
                    i++;
                }
                if (i < j) {
                    array[j--] = array[i]; // 将array[i]填入array[j],并将j向左移动
                }
            }
            array[i] = index; // 将基准数填入最后的坑
            quickSort(array, low, i - 1); // 递归调用,分治
            quickSort(array, i + 1, high); // 递归调用,分治
        }
     
        public static void quickSort(int[] array) {
            if (array == null || array.length == 0) {
                return;
            }
            quickSort(array, 0, array.length - 1);
        }
    }

    图解:

     

     核心步骤:

    1、选择一个基数,一般以第一个作为基数。

    2、从右到左扫描,发现比基数小的,互换。相等的可以不处理。

    3、从左到右扫描,发现比基数大的,互换。相等的可以不处理。

    重复2 , 3直到 i,j 相等。

    这样基数左边的都比基数小,基数右边的都比基数大。

    4、对基数左边和右边的区间进行以上相同的操作。

    结束!

  • 相关阅读:
    HDU1542 Atlantis(矩形面积并)
    HDU4784 Dinner Coming Soon(dp)
    1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)
    BZOJ 1004: [HNOI2008]Cards(群论)
    BZOJ USACO 银组 水题集锦
    BZOJ 3401: [Usaco2009 Mar]Look Up 仰望(离线+平衡树)
    BZOJ 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(博弈论)
    BZOJ 3208: 花神的秒题计划Ⅰ
    BZOJ 2456: mode(乱搞)
    BZOJ 2424: [HAOI2010]订货(费用流)
  • 原文地址:https://www.cnblogs.com/tangZH/p/15095305.html
Copyright © 2020-2023  润新知