JAVA十大排序算法之快速排序详解

JAVA十大排序算法之快速排序详解

算法介绍

快速排序是一种基于分治思想的排序算法,是十大排序算法中非常常用的一种。它的核心思想是取一个基准值,将数组中小于基准值的放在一边,大于它的放在另一边,递归地对两个子集进行排序。通过多次分区排序,最终将整个数组排序。

算法步骤

  1. 选择基准值,通常取区间的第一个元素(也可以取随机元素)
  2. 分区操作:将区间根据基准值划分为两个子区间,小于等于基准值的放在左边,大于基准值的放在右边
  3. 对左右两个子区间分别进行递归操作
  4. 递归结束条件:区间大小为1或0

代码实现

public static void quickSort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int pivotIndex = partition(arr, left, right);
    quickSort(arr, left, pivotIndex - 1);
    quickSort(arr, pivotIndex + 1, right);
}

public static int partition(int[] arr, int left, int right) {
    int pivot = arr[left];
    int i = left, j = right;
    while (i < j) {
        while (i < j && arr[j] > pivot) {
            j--;
        }
        if (i < j) {
            arr[i] = arr[j];
            i++;
        }
        while (i < j && arr[i] <= pivot) {
            i++;
        }
        if (i < j) {
            arr[j] = arr[i];
            j--;
        }
    }
    arr[i] = pivot;
    return i;
}

算法分析

快速排序的平均时间复杂度为 O(nlogn),最坏情况下的时间复杂度为 O(n^2)。空间复杂度为 O(logn)。在实际应用中,快速排序是十大排序算法中平均性能最好的,常用于排序大量数据。

示例说明

以下是对数组 {3, 5, 1, 6, 2, 9, 8, 7, 4} 进行快速排序的过程。

  1. 选择基准值 pivot=3,i=0,j=8。
  2. 从右往左扫描,找到第一个小于 pivot 的数 arr[j],交换 arr[i] 和 arr[j],此时数组为 {2, 5, 1, 6, 3, 9, 8, 7, 4},i=1,j=4。
  3. 从左往右扫描,找到第一个大于 pivot 的数 arr[i],交换 arr[i] 和 arr[j],此时数组为 {2, 1, 3, 6, 5, 9, 8, 7, 4},i=2,j=4。
  4. 从右往左扫描,找到第一个小于 pivot 的数 arr[j],交换 arr[i] 和 arr[j],此时数组为 {2, 1, 3, 4, 5, 9, 8, 7, 6},i=3,j=3。
  5. 递归左右两个子区间,left=0,right=2 的子区间是 {2, 1, 3},left=4,right=8 的子区间是 {5, 9, 8, 7, 6}。
  6. 对左子区间进行快速排序,选择基准值 pivot=2,i=0,j=2,数组排序为 {1, 2, 3}。
  7. 对右子区间进行快速排序,选择基准值 pivot=5,i=0,j=4,数组排序为 {4, 5, 6, 7, 8, 9}。
  8. 最终得到有序数组 {1, 2, 3, 4, 5, 6, 7, 8, 9}。

通过以上示例可以清晰地展示快速排序的分区过程,以及如何递归地对子区间进行排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA十大排序算法之快速排序详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java数据库连接池的几种配置方法(以MySQL数据库为例)

    让我来为您详细讲解Java数据库连接池的几种配置方法(以MySQL数据库为例)。 1. 简介 Java数据库连接池是Java程序与数据库之间的重要组件,它可以管理JDBC连接对象。在传统的JDBC编程中,每次使用数据库连接时都需要手动获取和释放连接,这样容易造成资源浪费和连接泄漏的情况。而使用数据库连接池,则可以通过预先创建一定数量的连接对象,并在需要时分配…

    Java 2023年5月19日
    00
  • Java异常处理UncaughtExceptionHandler使用实例代码详解

    下面我将详细讲解“Java异常处理UncaughtExceptionHandler使用实例代码详解”的攻略,分为以下几个部分: 1. 什么是UncaughtExceptionHandler Java中的异常会在程序运行时抛出,如果我们没有对这些异常进行处理,就会导致程序崩溃或者无法正常运行。为了解决这个问题,我们可以使用Java的UncaughtExcept…

    Java 2023年5月28日
    00
  • IDEA+Maven创建Spring项目的实现步骤

    创建Maven项目 使用IDEA创建Maven项目,步骤如下: 点击IDEA的File菜单,选择New,然后选择Project; 在弹出的New Project窗口中,选择Maven; 在下一步中,我们需要输入项目的信息,包括 GroupId、ArtifactId、Version、Project name,这些信息都可以任意填写; 最后,点击Finish按钮…

    Java 2023年5月20日
    00
  • Sql注入工具_动力节点Java学院整理

    为了防止不良分子利用SQL注入技术攻击网站,我们需要通过测试工具来检测自己的网站是否存在SQL注入漏洞。而“SQL注入工具_动力节点Java学院整理”就是一种用于检测SQL注入漏洞的工具。下面是详细的使用攻略: 1. 下载SQL注入工具 我们可以从官网上下载SQL注入工具,链接为:https://www.sqlmap.org/ 。下载完成后,解压缩到本地。 …

    Java 2023年5月20日
    00
  • java使用Hashtable过滤数组中重复值的方法

    如何使用Hashtable过滤数组中的重复值,可以分为以下几步: 1. 创建Hashtable对象 创建Hashtable对象,用于存储数组中的元素。 Hashtable<Integer, Integer> hashTable = new Hashtable<Integer, Integer>(); 2. 遍历数组 使用for循环遍历…

    Java 2023年5月26日
    00
  • EL调用Java方法_动力节点Java学院整理

    EL调用Java方法_动力节点Java学院整理 使用EL表达式可以直接调用Java对象中的普通方法。通过EL表达式调用Java方法可以实现更加灵活的数据操作,并且简化代码。 EL调用Java方法的语法格式 ${对象.方法名(参数1, 参数2, …)} 其中,“对象”是Java对象的实例化对象,“方法名”是Java对象中的方法名称,后面的“参数1, 参数2…

    Java 2023年5月26日
    00
  • SpringBoot FreeWorker模板技术解析

    SpringBoot FreeMarker模板技术解析 什么是FreeMarker模板引擎 FreeMarker是一款基于模板的Java模板引擎,它可以将模板和数据混合在一起生成输出文本,常用于动态生成HTML,XML,电子邮件等文本。 FreeMarker的特点: 容易创建和维护模板 可以产生非常多的输出格式(HTML,XML,XHTML,PDF等等) 可…

    Java 2023年5月19日
    00
  • 详解通过maven运行项目的两种方式

    下面为你详细讲解一下关于“通过maven运行项目的两种方式”的完整攻略。 一、基础知识 在讲解这两种方式之前,先了解一下maven。maven是一个Java项目的自动化构建工具,可以进行项目的编译、测试、打包和部署等一系列操作。它通过一个POM(Project Object Model)文件来管理项目依赖和配置。 二、方式一:使用maven插件运行项目 这种…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部