讲师中心 微信公众号
AI工具推荐 视频效率加速

Java中快速排序的原理 图解快速排序的分治思想实现

星强君_1026

星强君_1026

发布时间:2025-06-19 16:09:02

|

599人浏览过

|

来源于php中文网

原创

快速排序的核心在于分治思想,通过选取基准值将数组分为两个子数组并递归排序。1. 选择基准值(如首元素、随机或三数取中),2. 分区使小于基准值的在左、大于的在右,3. 递归对左右子数组排序。其平均时间复杂度为o(n log n),但最坏情况下可能退化到o(n^2)。相比其他算法,快速排序效率高且空间占用少,但不稳定且最坏性能较差,适用于大数据集且可接受不稳定的场景。

Java中快速排序的原理 图解快速排序的分治思想实现

快速排序的核心在于分治思想,通过选取一个基准值,将数组划分为两个子数组,小于基准值的放在左边,大于基准值的放在右边,然后递归地对这两个子数组进行排序。

Java中快速排序的原理 图解快速排序的分治思想实现

快速排序是一种高效的排序算法,尤其在处理大数据集时表现出色。它的平均时间复杂度为O(n log n),但在最坏情况下可能退化到O(n^2)。理解快速排序的关键在于掌握其分治思想和基准值的选取。

Java中快速排序的原理 图解快速排序的分治思想实现

快速排序算法步骤详解

  1. 选择基准值(Pivot): 从数组中选取一个元素作为基准值。选择策略会影响算法的性能,常见的有选择第一个元素、最后一个元素或随机选择。

    立即学习“Java免费学习笔记(深入)”;

    Java中快速排序的原理 图解快速排序的分治思想实现
  2. 分区(Partitioning): 重新排列数组,使得所有小于基准值的元素都移动到基准值左边,所有大于基准值的元素都移动到基准值右边。基准值位于其最终排序位置。

  3. 递归排序: 递归地对基准值左右两边的子数组进行快速排序。

让我们用一个例子来说明:假设有数组 [7, 2, 1, 6, 8, 5, 3, 4],我们选择第一个元素 7 作为基准值。

  • 经过分区操作后,数组可能变为 [2, 1, 6, 5, 3, 4, 7, 8]。可以看到,所有小于 7 的元素都在左边,所有大于 7 的元素都在右边,7 已经位于其最终位置。

  • 然后,我们分别对 [2, 1, 6, 5, 3, 4] 和 [8] 这两个子数组进行递归排序。

如何选择合适的基准值以优化快速排序性能?

基准值的选择对快速排序的性能至关重要。理想情况下,基准值应该尽可能地将数组分成大小相等的两部分。以下是一些常见的基准值选择策略:

AI舌诊面诊问诊医疗系统+诊疗商城系统源码
AI舌诊面诊问诊医疗系统+诊疗商城系统源码

AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。

下载
  • 选择第一个元素或最后一个元素: 这是最简单的策略,但如果数组已经部分有序,会导致最坏情况的发生,时间复杂度退化到O(n^2)。

  • 随机选择: 随机选择基准值可以有效地避免最坏情况的发生,平均性能较好。

  • 三数取中: 从数组的第一个、中间和最后一个元素中选择大小居中的元素作为基准值。这种方法在一定程度上可以避免选择到极端值。

实际应用中,可以根据数据特点选择合适的基准值选择策略。如果数据分布均匀,随机选择可能是一个不错的选择。如果数据可能已经部分有序,三数取中可能更合适。

快速排序的Java代码实现示例

下面是一个简单的快速排序的Java代码实现:

public class QuickSort {

    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pivotIndex = partition(arr, low, high);

            quickSort(arr, low, pivotIndex - 1);
            quickSort(arr, pivotIndex + 1, high);
        }
    }

    private static int partition(int[] arr, int low, int high) {
        int pivot = arr[low];
        int i = low + 1;
        int j = high;

        while (i <= j) {
            while (i <= high && arr[i] <= pivot) {
                i++;
            }

            while (j >= low && arr[j] > pivot) {
                j--;
            }

            if (i < j) {
                swap(arr, i, j);
                i++;
                j--;
            } else {
                break;
            }
        }
        swap(arr, low, j);
        return j;
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        int[] arr = {7, 2, 1, 6, 8, 5, 3, 4};
        quickSort(arr, 0, arr.length - 1);

        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

这段代码首先定义了quickSort方法,用于递归地对数组进行排序。partition方法用于将数组划分为两个子数组,并返回基准值的索引。swap方法用于交换数组中两个元素的位置。

快速排序与其他排序算法相比有哪些优缺点?

与其他排序算法相比,快速排序的优点在于其平均时间复杂度为O(n log n),并且是原地排序算法,不需要额外的存储空间(除了递归调用栈)。缺点在于最坏情况下时间复杂度会退化到O(n^2),并且不稳定(相同元素的相对位置可能会改变)。

与归并排序相比,快速排序通常更快,因为其常数因子更小。但归并排序是稳定的,并且最坏情况下时间复杂度仍然是O(n log n)。

与冒泡排序、插入排序等简单排序算法相比,快速排序在大数据集上的性能优势非常明显。但对于小数据集,简单排序算法可能更快,因为其常数因子更小。

选择哪种排序算法取决于具体的应用场景。如果需要稳定的排序,或者对最坏情况下的性能有严格要求,归并排序可能更合适。如果对性能要求较高,并且可以接受不稳定性,快速排序通常是一个不错的选择。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5967

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2548

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6076

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

0

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

0

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

0

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

0

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn