zoukankan      html  css  js  c++  java
  • 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、对基数左边和右边的区间进行以上相同的操作。

    结束!

  • 相关阅读:
    若依启动非常慢
    【转】上火了一吃就好的食物
    实型输入控制
    【转】中国地理的几个概念
    如何在阅读邮件时时保留原有html格式正文的样式
    好的代码不是设计出来的,而是重构出来的
    .net用OLEDB方式操作SqlServer和Sybase
    悬浮框实现
    C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍
    ODBC驱动重新注册
  • 原文地址:https://www.cnblogs.com/tangZH/p/15095305.html
Copyright © 2011-2022 走看看