news 2026/9/24 13:35:17

十大排序算法之快速排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
十大排序算法之快速排序

一.概念:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

二.步骤:

1、首先设定一个分界值,通过该分界值将数组分成左右两部分。

2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

4、重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

三.图示示例:

快速排序主要有三个参数,left 为区间的开始地址,right 为区间的结束地址,Key 为当前的开始的值。

从待排序的记录序列中选取一个记录(通常第一个)作为基准元素(称为key)key=a[left],然后设置两个变量,left指向数列的最左部,right 指向数据的最右部

key=65

65588810613

left right

第一步:
key 首先与 a[right] 进行比较,如果 a[right]<key,则a[left]=a[right]将这个比key小的数放到左边去,如果a[right]>key则我们只需要将right--,right--之后,再拿a[right]与key进行比较,直到a[right]<key交换元素为止。

key=65

135888106

left right

第二步
如果右边存在a[right]<key的情况,将a[left]=a[right],接下来,将转向left端,拿a[left ]与key进行比较,如果a[left]>key,则将a[right]=a[left],如果a[left]<key,则只需要将left++,然后再进行arr[left]与key的比较。

key=65

135888106

left right

135888106

left right

135810688

left right

第三步

然后再移动right重复上述步骤。

key=65

13586510688

left right

第四步
最后得到 {13 85} 65 {106 88 },再对左子数列与右子数列进行同样的操作。最终得到一个有序的数列。

13 {58} 65 {88} 106

13 58 65 88 106

import java.util.*; import static java.util.Collections.swap; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int[] a = new int[n]; for (int i = 0; i < n; i++) { a[i]=scan.nextInt(); } int x=a.length-1; partition(a,0,x); for (int i = 0; i < n; i++) { System.out.print(a[i]+" "); } } public static int[] partition(int[]a,int left,int right){ int x=a[left]; int i = left; int j = right; while (i<j) { while ((i<j)&&(a[j]>x)) { j--; } while ((i<j)&&(a[i]<x)) { i++; } if ((i<j)&&(a[i]==a[j])) { i++; } else { int temp = a[i]; a[i] = a[j]; a[j] = temp; } } if (i-1>left)a=partition(a,left,i-1); if (j+1<right)a=partition(a,j+1,right); return (a); } }


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

【DvAdmin】写个脚本更新云端前后端服务

在现代软件开发中,前后端代码更新和部署是常见的操作。然而,传统的手动更新过程繁琐且耗时,极大地影响了开发效率。通过Python脚本实现自动化,能够简化这些操作,显著提升工作效率和项目部署的便捷性。 本文将展示如何利用Python中的paramiko库编写自动化脚本,帮助开发者…

作者头像 李华
网站建设 2026/9/24 13:34:00

【Dv2Admin】自定义审批流程数据验证和用户交互

在当今的数字化时代,企业的高效运作和用户友好性在很大程度上依赖于管理系统的设计与实现。其中,自定义审批流程作为管理系统中的核心功能,其精确、灵活且易用的实现变得尤为重要。 本文将探讨如何通过Django和Vue.js框架的结合,构建一个高效、直观的审批流程管理系统。通…

作者头像 李华
网站建设 2026/9/24 13:33:42

【Dv2Admin】dvadmin用户功能基础models解析

在现代软件开发中,数据模型的设计和管理直接决定了系统的可扩展性、性能和维护成本。尤其在基于Django-Vue-Admin框架的项目中,数据模型的合理设计更是确保系统稳定高效运行的关键。本文将重点介绍项目中核心数据模型的实现,包括Users、Post、Role、Dept、Menu、MenuButton、…

作者头像 李华
网站建设 2026/9/24 13:33:32

增加F110 付款方式的随手记录

随便记录一下,基本上有这些信息可以了 为了保持PRD与测试机一致的银行代码,需要先在DEV,QAS 改成4 外部给号 主要都是在FBZP

作者头像 李华
网站建设 2026/9/24 13:33:06

Linux实战|Swap交换空间 + CentOS7系统启动流程 + 故障修复完整笔记

Linux实战&#xff5c;Swap交换空间 CentOS7系统启动流程 故障修复完整笔记 引言 本篇适合CentOS7运维入门同学。读完本篇博客你将掌握&#xff1a; 计算机存储器层级原理&#xff0c;理解虚拟内存、Swap交换空间是什么&#xff0c;学会创建、激活、持久化配置swap&#xff1…

作者头像 李华
网站建设 2026/9/24 13:32:44

【Dify】智能表格自动化应用

以数据驱动的智能化自动处理正逐步成为数字时代的核心需求。结合Excel、Flask与Dify平台,数据流动与AI能力得以深度整合,推动表格处理的自动化、智能化。 本文聚焦于以标准化Excel为数据源,构建本地API服务,并借助Dify平台完成数据的智能解析、批量分析与结构化输出的完整…

作者头像 李华