news 2026/2/5 14:17:54

深入理解快速排序算法(Java实现)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入理解快速排序算法(Java实现)

深入理解快速排序算法(Java实现)

1. 算法简介

快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2. 核心思想

快速排序使用分治法(Divide and Conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

步骤为:

  1. 从数列中挑出一个元素,称为 "基准"(pivot);
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

3. Java 代码实现

下面是一个标准的快速排序实现:

import java.util.Arrays; public class QuickSort { public static void main(String[] args) { int[] arr = {10, 7, 8, 9, 1, 5}; System.out.println("原始数组: " + Arrays.toString(arr)); quickSort(arr, 0, arr.length - 1); System.out.println("排序后数组: " + Arrays.toString(arr)); } /** * 快速排序主方法 * @param arr 待排序数组 * @param low 起始索引 * @param high 结束索引 */ public static void quickSort(int[] arr, int low, int high) { if (low < high) { // partitionIndex 是分区操作后 pivot 的位置 int partitionIndex = partition(arr, low, high); // 递归排序 pivot 左边和右边的元素 quickSort(arr, low, partitionIndex - 1); quickSort(arr, partitionIndex + 1, high); } } /** * 分区操作 * 该函数选取最后一个元素作为 pivot * 将小于 pivot 的元素放在 pivot 左边 * 将大于 pivot 的元素放在 pivot 右边 */ private static int partition(int[] arr, int low, int high) { // 选择最后一个元素作为基准 int pivot = arr[high]; // i 是较小元素的索引 int i = (low - 1); for (int j = low; j < high; j++) { // 如果当前元素小于或等于 pivot if (arr[j] <= pivot) { i++; // 交换 arr[i] 和 arr[j] swap(arr, i, j); } } // 交换 arr[i+1] 和 arr[high] (或 pivot) swap(arr, i + 1, high); return i + 1; } /** * 交换数组中的两个元素 */ private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }

4. 复杂度分析

  • 时间复杂度
    • 平均情况:O(n log n)
    • 最坏情况:O(n^2) (例如数组已经有序,且每次选择最后一个元素作为基准)
    • 最好情况:O(n log n)
  • 空间复杂度:O(log n) (递归调用栈的空间)

快速排序通常被认为是同数量级(O(n log n))的排序算法中平均性能最好的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 3:46:28

AI赋能网文创作:高质量小说提纲撰写实操指南

在网络小说创作领域&#xff0c;提纲是作品的骨架&#xff0c;决定了故事的逻辑走向、人物弧光与读者粘性。随着AI技术的快速发展&#xff0c;越来越多的网文作者开始借助AI工具提升创作效率&#xff0c;但如何让AI精准捕捉创作意图、生成高质量提纲&#xff0c;成为很多作者面…

作者头像 李华
网站建设 2026/2/5 7:29:12

js如何实现内网大文件上传?附实例代码

【一个网工仔的悲喜交加&#xff1a;前端搞定了&#xff0c;后端求包养&#xff01;】 各位道友好&#xff01;俺是山西某高校网络工程专业的菜狗一枚&#xff0c;刚啃完《JavaScript从入门到住院》&#xff0c;就被导师按头要求搞个10G大文件上传系统。现在前端用Vue3原生JS硬…

作者头像 李华
网站建设 2026/2/6 0:16:55

靶向蛋白组学研究直肠癌生物靶标

靶向蛋白组学研究直肠癌生物靶标 直肠癌&#xff08;colorectal cancer&#xff09;是人类常见的恶性肿瘤之一。在西方发达国家其发病率位居恶性肿瘤的第二位。生物靶标的研究对于直肠癌的治疗有着重要意义。在过去几十年的许多研究中已经揭示了许多潜在的直肠癌生物靶标&…

作者头像 李华
网站建设 2026/2/5 18:27:12

记录拐点

lc3637 记录拐点 i-2 i-1 i 看三个位置if ((nums[i - 2] < nums[i - 1]) ! (nums[i - 1] < nums[i])) cnt;class Solution { public:bool isTrionic(vector<int>& nums) {if (nums[0] > nums[1]) return false;int cnt 1;for (int i 2; i < nums.siz…

作者头像 李华
网站建设 2026/2/6 2:01:23

SQL注入操作检查:原理、检测与防范

SQL注入&#xff08;SQL Injection&#xff09;是一种通过恶意SQL代码操控数据库的攻击技术&#xff0c;其核心在于利用应用程序输入验证不足&#xff0c;将用户输入直接拼接至SQL查询中&#xff0c;导致未授权数据访问或系统控制。对于软件测试从业者&#xff0c;掌握其操作检…

作者头像 李华