【数据结构】快速排序

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

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

  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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/22441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring指定bean在哪个应用加载

1.背景 某项目,spring架构,有2个不同的WebAppApplication入口,大部分service类共用,小部分类有区别,只需要在一个应用中加载,不需要在另一个应用中加载. 2.实现代码 自定义限制注解 package mis.shared.annotation;import java.lang.annotation.ElementType; import java.lan…

springboot+maven插件调用mybatis generator自动生成对应的mybatis.xml文件和java类

mybatis最繁琐的事就是sql语句和实体类&#xff0c;sql语句写在java文件里很难看&#xff0c;字段多的表一开始写感觉阻力很大&#xff0c;没有耐心&#xff0c;自动生成便成了最称心的做法。自动生成xml文件&#xff0c;dao接口&#xff0c;实体类&#xff0c;虽一直感觉不太优…

skywalking全链路追踪

文章目录 一、介绍二、全链路追踪1. 测试1 - 正常请求2. 测试2 - 异常请求 三、过滤非业务请求链路1. 链路忽略插件2. 配置3. 测试 一、介绍 在上一篇文章skywalking安装教程中我们介绍了skywalking的作用以及如何将其集成到我们的微服务项目中。本篇文章我们介绍在微服务架构…

router 跳转打开新窗口

let url router.resolve({name: screen, })?.hrefwindow.open(url, _black)注意&#xff1a;新窗口无法全屏 参考链接&#xff1a;https://stackoverflow.com/questions/29281986/run-a-website-in-fullscreen-mode/30970886#30970886

数据库索引失效的情况

1.对添加了索引的字段进行函数运算 2.如果是字符串类型的字段&#xff0c;如果不加单引号也会导致索引失效 3.如果最索引字段使用模糊查询&#xff0c;如果是头部模糊索引将失效&#xff0c;如果是尾部模糊索引则正常 4.如果使用or分割符&#xff0c;如果or前面的条件中的列有…

基于Yolov2深度学习网络的车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. 卷积神经网络&#xff08;CNN&#xff09; 4.2. YOLOv2 网络 4.3. 实现过程 4.4. 应用领域 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心…

使用css和js给按钮添加微交互的几种方式

使用css和js给按钮添加微交互的几种方式 在现实世界中&#xff0c;当我们轻弹或按下某些东西时&#xff0c;它们会发出咔嗒声&#xff0c;例如电灯开关。有些东西会亮起或发出蜂鸣声&#xff0c;这些响应都是“微交互”&#xff0c;让我们知道我们何时成功完成了某件事。在本文…

【Winform学习笔记(五)】引用自定义控件库(dll文件)

引用自定义控件库dll文件 前言正文1、生成dll文件2、选择工具箱项3、选择需要导入的dll文件4、确定需要导入的控件5、导入及使用 前言 在本文中主要介绍 如何引用自定义控件库(dll文件)。 正文 1、生成dll文件 通过生成解决方案 或 重新生成解决方案 生成 dll 文件 生成的…

如何发布自己的npm包

发布一个简单的npm包 首先创建一个文件夹&#xff08;唯一的命名&#xff09;创建package.json包&#xff0c;输出npm init&#xff0c;一直回车就好。创建index.js文件&#xff0c;向外暴露方法。 将包上传或更新到 npm 执行登录命令&#xff1a;npm login 登录npm官网&…

Java中的SPI机制与扫描class原理

文章目录 前言ClassLoaderJAVA SPI机制Spring SPI机制示例原理 如何加载jar包里的class 前言 Java的SPI机制与Spring中的SPI机制是如何实现的&#xff1f; ClassLoader 这里涉及到了class Loader的机制&#xff0c;有些复杂&#xff0c;jdk中提供默认3个class Loader&#x…

AP AUTOSAR在软件定义汽车生态系统中的角色

AP AUTOSAR在软件定义汽车生态系统中的角色 AP AUTOSAR是AUTOSAR(汽车开放系统架构)的最新版本之一,它是一种面向服务的软件平台,旨在满足未来汽车电子系统的需求,特别是高性能计算、高带宽通信、软件无线更新(OTA)等方面。 AP AUTOSAR在软件定义汽车生态系统中扮演着…

docker 部署mysql 5.6集群

docker搭建mysql的集群&#xff08;一主双从&#xff09; 1.拉取镜像 docker pull mysql:5.6 2.启动master容器 docker run -it -d --name mysql_master -p 3306:3306 --ip 192.168.162.100 \ -v /data/mysql_master/mysql:/var/lib/mysql \ -v /data/mysql_master/conf.d…

【无标题】云原生在工业互联网的落地及好处!

什么是工业互联网&#xff1f; 工业互联网&#xff08;Industrial Internet&#xff09;是新一代信息通信技术与工业经济深度融合的新型基础设施、应用模式和工业生态&#xff0c;通过对人、机、物、系统等的全面连接&#xff0c;构建起覆盖全产业链、全价值链的全新制造和服务…

Scrum是什么意思,Scrum敏捷项目管理工具有哪些?

一、什么是Scrum&#xff1f; Scrum是一种敏捷项目管理方法&#xff0c;旨在帮助团队高效地开展软件开发和项目管理工作。 Scrum强调迭代和增量开发&#xff0c;通过将项目分解为多个短期的开发周期&#xff08;称为Sprint&#xff09;&#xff0c;团队可以更好地应对需求变…

聊聊混合动力汽车和纯电骑车的优势和劣势

混合动力汽车和纯电动骑车是两种不同的交通工具&#xff0c;它们都有各自的优势和劣势。本文将分别探讨混合动力汽车和纯电动骑车的优势和劣势&#xff0c;并为文章提供三个备选的好听的标题。 混合动力汽车是一种结合了内燃机和电动机的汽车&#xff0c;它可以同时利用燃油和电…

使用隧道HTTP时如何解决网站验证码的问题?

使用代理时&#xff0c;有时候会遇到网站验证码的问题。验证码是为了防止机器人访问或恶意行为而设置的一种验证机制。当使用代理时&#xff0c;由于请求的源IP地址被更改&#xff0c;可能会触发网站的验证码机制。以下是解决网站验证码问题的几种方法&#xff1a; 1. 使用高匿…

树和二叉树 --- 数据结构

目录 1.树的概念及结构 1.1树的概念 1.2树的表示 1.3树在实际生活中的运用 2.二叉树的概念及结构 2.1概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n (n>0)个有限结点组成…

No primary or single unique constructor found for interface java.util.List

报错截图&#xff1a; 报错内容&#xff1a; 2023-08-04 15:46:32.884 ERROR 14260 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing fa…

Android 版本 对应的 API版本

Android 14&#xff08;开发者预览版&#xff09; 如需详细了解平台变更&#xff0c;请参阅 Android 14 文档。 Android 13&#xff08;API 级别 33&#xff09; 如需详细了解平台变更&#xff0c;请参阅 Android 13 文档。 Android 12&#xff08;API 级别 31、32&#xf…

接口自动化测试-Postman+Newman+Git+Jenkins实战集成(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Postman 创建…