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

【数据结构】快速排序

快速排序是一种高效的排序算法,其基本思想是分治法。它将一个大问题分解成若干个小问题进行解决,最后将这些解合并得到最终结果。

快速排序的主要思路如下:

  1. 选择一个基准元素:从待排序的数组中选择一个元素作为基准(pivot)。通常选择第一个元素、最后一个元素或者随机选择一个元素作为基准。
  2. 划分操作:将数组中的元素按照与基准的大小关系分成两部分,一部分小于基准,一部分大于基准。基准元素的选择决定了这个划分的位置。
  3. 递归排序:对划分后的两个子数组分别进行快速排序,即递归地调用快速排序函数,直到子数组的大小为1或0时终止递归。
  4. 合并结果:递归的终止条件是子数组的大小为1或0,此时子数组已经是有序的。然后将有序的子数组合并成一个有序的数组,整个排序过程完成。

快速排序的关键在于划分操作,通过每次划分将元素按照大小分开,使得在每次递归中,排序的元素数量逐渐减少,从而达到快速排序的效果。由于快速排序采用分治法,并且在平均情况下具有很好的时间复杂度(O(n log n)),因此它在实际应用中是一种较为常用的排序算法。然而,最坏情况下的时间复杂度为O(n^2),这可以通过合理选择基准元素或采用随机化的方法进行优化。

实现步骤

首先设置一个数组,先找到最左侧和最右侧
在这里插入图片描述
我们以left为pivot,如果比他大,就和right交换,right–,如果比pivot小,那么left和left+1交换,left++
在这里插入图片描述
这里5>3,所以left+1与right交换,right–
在这里插入图片描述
再次判断,4>3,所以接着与right交换
在这里插入图片描述
第三次判断 3>2 所以left和left+1交换,left++
在这里插入图片描述
第四次判断,3>1,所以left和left+1交换,left++
在这里插入图片描述
这里可以看见left已经和right重合了,此时以3为pivot,左边全小于3,而右边全部大于3
这一个回合就完成了,而我们要做的就是如果左右的数组长度大于1,那么就拆分出来重新做上述的拆分,然后排序
在这里插入图片描述
这就是快速排序的整体思路
下面给出快速排序的Java,C++,Python代码
Java:

public class QuickSort {public static void main(String[] args) {int[] arr = {153,134,153,14,196,4,616,435,156,1561,683,561,651,685,46,42};sort(0, arr.length-1,arr);System.out.println(Arrays.toString(arr));}public static void sort(int left, int right,int[] array){int startIndex = left;int endIndex = right;while (left < right){if (array[left] >= array[left+1]){int temp = array[left];array[left] = array[left+1];array[left+1] = temp;left++;}else {int temp = array[left + 1];array[left + 1] = array[right];array[right] = temp;right--;}}if (left - startIndex -1 > 0){sort(startIndex,left-1,array);}if(endIndex - left - 1 > 0){sort(left+1,endIndex,array);}}
}

C++:

#include <iostream>
#include <vector>void quick_sort(std::vector<int>& array, int left, int right) {int startIndex = left;int endIndex = right;while (left < right) {if (array[left] >= array[left + 1]) {int temp = array[left];array[left] = array[left + 1];array[left + 1] = temp;left++;} else {int temp = array[left + 1];array[left + 1] = array[right];array[right] = temp;right--;}}if (left - startIndex - 1 > 0) {quick_sort(array, startIndex, left - 1);}if (endIndex - left - 1 > 0) {quick_sort(array, left + 1, endIndex);}
}int main() {std::vector<int> arr = {153, 134, 153, 14, 196, 4, 616, 435, 156, 1561, 683, 561, 651, 685, 46, 42};quick_sort(arr, 0, arr.size() - 1);for (int i = 0; i < arr.size(); i++) {std::cout << arr[i] << " ";}std::cout << std::endl;return 0;
}

Python:

def quick_sort(array):if len(array) <= 1:return arraypivot = array[0]left = [x for x in array[1:] if x <= pivot]right = [x for x in array[1:] if x > pivot]return quick_sort(left) + [pivot] + quick_sort(right)arr = [153, 134, 153, 14, 196, 4, 616, 435, 156, 1561, 683, 561, 651, 685, 46, 42]
sorted_arr = quick_sort(arr)
print(sorted_arr)

相关文章:

【数据结构】快速排序

快速排序是一种高效的排序算法&#xff0c;其基本思想是分治法。它将一个大问题分解成若干个小问题进行解决&#xff0c;最后将这些解合并得到最终结果。 快速排序的主要思路如下&#xff1a; 选择一个基准元素&#xff1a;从待排序的数组中选择一个元素作为基准&#xff08;…...

人机融合智能中的事实与价值

在人机融合智能中&#xff0c;事实和价值分别扮演着不同的角色和功能。 事实是客观存在的真实描述&#xff0c;可以通过数据、观测和验证等方式获取。在人机融合智能中&#xff0c;人工智能通过处理和分析大量的数据来提供客观事实的支持。例如&#xff0c;在搜索引擎中&#x…...

JVM | 从类加载到JVM内存结构

引言 我在上篇文章&#xff1a;JVM | 基于类加载的一次完全实践 中为你讲解如何请“建筑工人”来做一些定制化的工作。但是&#xff0c;大型的Java应用程序时&#xff0c;材料&#xff08;类&#xff09;何止数万&#xff0c;我们直接堆放在工地上&#xff08;JVM&#xff09;…...

Golang之路---04 并发编程——WaitGroup

WaitGroup 为了保证 main goroutine 在所有的 goroutine 都执行完毕后再退出&#xff0c;前面使用了 time.Sleep 这种简单的方式。 由于写的 demo 都是比较简单的&#xff0c; sleep 个 1 秒&#xff0c;我们主观上认为是够用的。 但在实际开发中&#xff0c;开发人员是无法…...

React(4)

1.属性&#xff08;props&#xff09;初始 状态state都是组件内部写的&#xff0c;也就是A组件内的state就只能A组件里面用&#xff0c;其他组件复用不了。因此属性props就可以。 比如一个导航栏&#xff0c;首页有&#xff0c;购物车有&#xff0c;我的有&#xff0c;他们三个…...

STM32 CubeMX USB_(HID 鼠标和键盘)

STM32 CubeMX STM32 CubeMX USB_HID&#xff08;HID 鼠标和键盘&#xff09; STM32 CubeMX前言 《鼠标小节》一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择 二、代码部分添加代码鼠标发送给PC的数据解析实验效果 《键盘小节》STM32 CubeMX 设置&#xff08;同上&#xf…...

[PM]敏捷开发之Scrum总结

在项目管理中&#xff0c;不少企业和项目团队也发现传统的项目管理模式已不能很好地适应今天的项目环境的要求。因此&#xff0c;敏捷项目管理应运而生&#xff0c;本文将为大家介绍Scrum敏捷项目管理以及应用方法。 什么是Scrum敏捷项目管理 敏捷项目管理作为新兴的项目管理模…...

大数据Flink(五十七):Yarn集群环境(生产推荐)

文章目录 Yarn集群环境(生产推荐) 一、准备工作...

web集群学习:源码安装nginx配置启动服务脚本

1、源码安装nginx&#xff0c;并提供服务脚本。 1、源码安装会有一些软件依赖 &#xff08;1&#xff09;检查并安装 Nginx 基础依赖包 pcre-devel 、openssl-devel # rpm -qa | egrep pcre-devel | openssl-devel&#xff08;2&#xff09;安装 Nginx 所需的 pcre 库 正则支…...

LNMP

lNmp安装&#xff1a; 一、LNMP LNMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c; 能够提供动态Web站点服务及其应用开发环境。LNMP是一个缩写词&#xff0c;具体包括Linux操作系统、nginx网站服务器、MySQL数据库服务…...

Python网络爬虫在信息采集中的应用及教程

Python网络爬虫在信息采集中的应用与法律警告 摘要 随着互联网的发展&#xff0c;我们每天都面临着海量的信息。这些信息蕴含着无尽的价值&#xff0c;而要从中获取有用的数据&#xff0c;网络爬虫就成了我们的得力助手。Python作为一门简单而又强大的编程语言&#xff0c;被…...

云主机测试Flink磁盘满问题解决

问题描述&#xff1a; 使用云主机测试Flink时&#xff0c;根目录满了。 经排查发现运行Flink任务后根目录空间一直在减少&#xff0c;最后定位持续增加的目录是/tmp目录 解决方法&#xff1a; 修改Flink配置使用一个相对较大的磁盘目录做为Flink运行时目录 # Override the…...

iOS开发-NSOperationQueue实现上传图片队列

iOS开发-NSOperationQueue实现上传图片队列 在开发中&#xff0c;遇到发帖需要上传图片&#xff0c;需要上传队列&#xff0c;这时候用到了NSOperationQueue 一、NSOperation与NSOperationQueue 什么NSOperation NSOperation为控制任务状态、优先级、依赖关系以及任务管理提…...

通过 CCIP 构建跨链应用(5 个案例)

Chainlink 的跨链互操作性协议&#xff08;CCIP&#xff09;是一种新的通用跨链通信协议&#xff0c;为智能合约开发人员提供了以最小化信任的方式在区块链网络之间传输数据和通证的能力。 目前&#xff0c;部署在多个区块链上的应用程序面临着资产、流动性和用户的碎片化问题…...

基于 yolov8 的人体姿态评估

写在前面 工作中遇到&#xff0c;简单整理博文内容为使用预训练模型的一个预测 Demo测试图片来源与网络,如有侵权请告知理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停…...

计算机视觉(六)图像分类

文章目录 常见的CNNAlexnet1乘1的卷积 VGG网络Googlenet&#xff08;Inception V1、V2、V3&#xff09;全局平均池化总结 Resnet、ResnextResNet残差网络ResNeXt网络 应用案例VGGResnet 常见的CNN Alexnet DNN深度学习革命的开始 沿着窗口进行归一化。 1乘1的卷积 VGG网络…...

解决:vue通过params传参刷新页面参数丢失问题以及实现vue路由可选参数的解决办法

目录 &#x1f64b;‍♂️ 实现params传参&#xff0c;刷新页面不丢参 &#x1f64b;‍♂️ 实现vue配置可选路由参数 &#x1f64b;‍♂️ 参考资料 解决vue 通过 name 和 params 进行页面传参时&#xff0c;刷新页面参数丢失问题以及vue路由实现可选参数 &#x1f64b;‍♂…...

将postman接口导出的json转换为markdown

您可以使用 Postman 官方提供的工具或第三方工具将 Collection 文件转换为 Markdown 文件。 方式一 Postman 官方提供的工具是 Newman&#xff0c;它是一个命令行工具&#xff0c;可以帮助您运行和测试 Postman Collection&#xff0c;还可以将 Collection 转换为多种格式&am…...

教您一招解决找素材困难好的方法

创作视频内容时&#xff0c;找到合适的素材是至关重要的。然而&#xff0c;有时候寻找视频素材可能会变得困难。本文将分享一些实用的方法&#xff0c;帮助您轻松解决找视频素材困难的问题。 素材库和在线平台是寻找视频素材的首选方法。 利用专业的视频剪辑工具 在电脑上安…...

python_PyQt5开发验证K线视觉想法工具V1.2_批量验证

目录 运行情况&#xff1a; ​编辑 结果json文件格式&#xff1a; 代码&#xff1a; 承接 【python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段】 博文 地址&#xff1a;python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段_程序猿与金融与科技的博客-…...

基于CubeMX与HAL库:STM32F302串口重定向Printf的工程化实践

1. 为什么需要串口重定向Printf 在嵌入式开发中&#xff0c;调试信息输出是排查问题的生命线。想象一下你正在调试一个复杂的传感器数据采集系统&#xff0c;突然发现数据异常&#xff0c;这时候如果能像在PC上编程一样直接printf("当前温度值&#xff1a;%f", temp…...

智慧树自动学习助手:三分钟实现高效网课学习的完整指南

智慧树自动学习助手&#xff1a;三分钟实现高效网课学习的完整指南 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台冗长的网课视频而烦恼吗&#xff1…...

YOLOv8鹰眼目标检测实战:一键部署,实时识别80种物体(附WebUI)

YOLOv8鹰眼目标检测实战&#xff1a;一键部署&#xff0c;实时识别80种物体&#xff08;附WebUI&#xff09; 1. 项目概述 1.1 什么是YOLOv8鹰眼目标检测 YOLOv8鹰眼目标检测是基于Ultralytics最新YOLOv8模型的工业级解决方案。它能够在毫秒级别完成图像中多达80类物体的识别…...

Anthropic代码泄露,AI江湖风云再起?

过去24小时&#xff0c;AI圈因Anthropic的两次泄露事件炸开了锅。Claude Code源码泄露&#xff0c;Mythos跑分也流出。这一系列事件不仅暴露了模型细节&#xff0c;还引发对Anthropic未来的诸多猜测。两次泄露&#xff0c;引发行业震动先是Claude Code源码意外泄露&#xff0c;…...

Steane编码实战指南:用Python模拟[7,1,3]量子纠错电路(附完整代码)

Steane编码实战指南&#xff1a;用Python模拟[7,1,3]量子纠错电路&#xff08;附完整代码&#xff09; 量子计算正从实验室走向现实应用&#xff0c;但量子比特的脆弱性始终是横亘在实用化道路上的关键障碍。想象一下&#xff0c;当你精心设计的量子算法因为一个随机的相位翻转…...

javaweb农家乐民宿客房美食预订活动管理系统

目录 同行可拿货,招校园代理 ,本人源头供货商系统功能模块划分核心业务流程设计数据分析功能技术实现要点 项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 同行可拿货,招校园代理 ,本人源头供货商 系统功能模块划分 用户管理…...

2026软考高项论文题目预测!十大管理+绩效域双押题(附答题思路)

备考软考高项的同学都知道&#xff0c;论文是决定成败的关键一科。随着2025年绩效域全面上位&#xff0c;论文考核方式已从“单一知识点”升级为“绩效域协同五大过程组联动可量化测量指标”的实战型命题。2026年考什么&#xff1f;如何准备&#xff1f;本文基于近3年命题规律&…...

丰田的“改善”到底牛在哪?-云质QMS为您解读精益生产的核心

提到丰田&#xff0c;大家第一反应大概率是精益生产、JIT 即时制&#xff0c;却很少有人深究&#xff0c;支撑丰田几十年持续领跑制造业的底层逻辑&#xff0c;其实是那个看似简单的日语词 ——改善&#xff08;kaizen&#xff09;。很多企业学丰田学了个皮毛&#xff0c;照搬流…...

Hunyuan-MT-7B入门必看:从环境配置到Chainlit前端调用完整实操手册

Hunyuan-MT-7B入门必看&#xff1a;从环境配置到Chainlit前端调用完整实操手册 混元翻译大模型Hunyuan-MT-7B在WMT25国际翻译大赛中表现惊艳&#xff0c;31种语言中30种获得第一名&#xff0c;堪称同尺寸模型中的翻译王者。本文将手把手带你从零开始&#xff0c;完成环境配置、…...

Unity性能优化实战:用Job System并行处理海量数据,告别主线程卡顿

Unity性能优化实战&#xff1a;用Job System并行处理海量数据&#xff0c;告别主线程卡顿 当你的游戏场景中出现成千上万的粒子在飞舞&#xff0c;或是数百个NPC同时进行复杂的AI决策时&#xff0c;是否经常遇到帧率骤降的困扰&#xff1f;作为Unity开发者&#xff0c;我们每天…...