当前位置: 首页 > ds >正文

十大排序算法--快速排序

目录

原理

第一步 

第二步

代码

递归实现快速排序

原理

分治法核心步骤

  1. 选择基准值(Pivot)
    从数组中选一个元素作为基准值(如最右侧元素、中间元素或随机元素)。

  2. 分区(Partition)
    将数组分为两部分:

    • 左侧:所有元素 小于等于 基准值。

    • 右侧:所有元素 大于等于 基准值。
      基准值最终位于正确的位置(排序后的最终位置)。

  3. 递归排序子数组
    对左右子数组递归执行上述步骤,直到子数组长度为 1 或 0(已有序)。

 以下面这一组数字为例

第一步 

找一个基准值,这里以46为基准 

从后面往前找比基准值小的交换,从前面找比基准值大的交换。

        1.发现 7比46小,然后7现在就排在第一个。

        2.从前面找比46大的,找啊找,找到了94比46大,我们就把94放到原来7的位置,94也就是基准值的位置了,这样就完成了第一步。

 

第二步

经过第一步已经找到基准值的位置,从这里开始进行递归,对基准值左边与右边分别进行递归排序,直到排序完成。

代码

下面是递归代码展示:

import java.util.Arrays;/*** 快速排序* 先确定一个基准点* 将比基准值小的放在基准值左边,比基准值大的放在右边* 递归进行* 从后往前找比基准值小的并交换* 从前往后找比基准值大的并交换*/
public class FastSort {public void sort(int[] arr, int left, int right) {if (left >= right) {return;}int pivot = arr[left];int i = left;int 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;sort(arr, left, i - 1);sort(arr, i + 1, right);}public static void main(String[] args) {int arr[] = {46, 5, 3, 94, 2, 6, 7};FastSort f = new FastSort();System.out.println("排序前" + Arrays.toString(arr));f.sort(arr, 0, arr.length - 1);System.out.println("排序后" + Arrays.toString(arr));}}

结果页不出所料 

时间复杂度

快速排序的平均时间复杂度为O(nlogn),但最坏情况下也可以达到O(n2)。 

http://www.xdnf.cn/news/7642.html

相关文章:

  • VitePress 中以中文字符结尾的字体加粗 Markdown 格式无法解析
  • 颠覆传统:PROFINET转EthernetIP在油墨生产线的成功应用
  • 小土堆pytorch--神经网路-卷积层池化层
  • 时尚外观+专业性能丨特伦斯V30Pro重新定义便携电子钢琴
  • 深入剖析Zynq AMP模式下CPU1中断响应机制:从原理到创新实践
  • 【八股战神篇】Java虚拟机(JVM)高频面试题
  • Spring Validation校验
  • 吃透 Golang 基础:数据结构之数组
  • 高级SQL技巧:窗口函数与复杂查询优化实战
  • RestFul操作ElasticSearch:索引与文档全攻略
  • 【基于SpringBoot的图书购买系统】深度讲解 分页查询用户信息,分析前后端交互的原理
  • [Java实战] Docker 快速启动 Sentinel 控制台(二十八)
  • 【node.js】核心进阶
  • IP风险画像技术:如何用20+维度数据构建网络安全护城河?
  • 73.矩阵置零
  • 【b站计算机拓荒者】【2025】微信小程序开发教程 - 3 项目目录结构
  • 《Flask vs Django:项目规模、灵活性与开发时间的深入比较》
  • IDEA2025版本使用Big Data Tools连接Linux上Hadoop的HDFS
  • C# 语法篇:字段的定义和运算
  • linux crontab定时执行python找不到module问题解决
  • window 安装 wsl + cuda + Docker
  • 2025年通信系统与智能计算国际学术会议(CSIC2025)
  • vue2+webpack环境变量配置
  • 将 /dev/vdb1 的空间全部合并到 /dev/mapper/centos-root(即扩展 CentOS 的根分区)
  • .NET外挂系列:3. 了解 harmony 中灵活的纯手工注入方式
  • 保密行业工作沟通安全:吱吱软件的“四重防泄露”设计
  • 自动化测试脚本点击运行后,打开Chrome很久??
  • java中的Filter使用详解
  • [Linux] Linux线程信号的原理与应用
  • Python实现VTK - 自学笔记(4):用Widgets实现三维交互控制