十大排序算法之快速排序

快速排序

快速排序也称为分区交换排序,它采用的是分治思想,是冒泡排序的改良版。冒泡排序需要进行比较并交换的次数较多,因为它是在两个相邻数据之间进行比较并交换的操作,每次只能移动一个位置,而快速排序是在两个分区之间进行比较并交换的操作。

1. 算法思想

选取一个基准值,将待排序数据分为左(小于基准值)右(大于基准值)两个区间,然后对两个分区的数据进行同样的循环操作,最后便可得到一组有序数据。

2. 算法步骤

  1. 选取待排序数据的第一个数值作为分区标准。
  2. 遍历数组,将小于标准数的数据移到左边,将大于标准数的数据移到右边,则中间为标准数。
  3. 对标准数左右两个子序列分别进行(1)和(2)步的操作。
  4. 当左右子序列的长度均小于或等于1时,排序完成。

3. 算法分析

如果选取的标准数为待排序数组的中位数,即每次划分后的左右子序列长度基本一致,则时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n),为最好的情况。
如果待排序数组是逆序,第一趟选取的标准数为待排序数组的最大值,经过 n-1 次比较和移动后,得到一个n-1个元素的左子序列;第二趟选取的标准数依旧是待排序子序列的最大值,经过n-2次比较和移动后,得到一个n-2个元素的左子序列。以此类推,则总操作次数为:
C m a x = ∑ i = 1 n − 1 ( n − i ) = n ( n − 1 ) 2 ≈ n 2 C_{max}=\sum_{i = 1}^{n-1}{(n-i)}=\frac{n(n-1)}{2}\approx n^2 Cmax=i=1n1(ni)=2n(n1)n2
这是最坏的情况。因此快速排序的平均时间复杂度为 O ( n 2 ) O(n^2) O(n2),并且属于不稳定排序。

4. 算法代码

算法代码如下:
源码下载

Python

在这里插入图片描述
个人不建议使用这种冗杂的写法,这里只是为了让读者更方便理解。如果读者有编程基础,还是建议采用下面的写法:

Python

在这里插入图片描述

java

在这里插入图片描述
在这里插入图片描述

5. 输出结果

代码输出结果如下:
在这里插入图片描述

6. 算法过程分解

这里通过两段代码从两个角度进行分析和讲解。如果你都能看懂,那么恭喜你,你已经掌握了快速排序算法和递归思想。
(1)第一段代码的结果分解如下:
在这里插入图片描述
在这里插入图片描述
(2)第二段代码的结果分解如下:
在这里插入图片描述

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

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

相关文章

Q-Bench:一种用于低级别视觉通用基础模型的基准测试

1. 引言 多模态大语言模型(Multi-modality Large Language Models,后续简称多模态大模型)能够提供强大的通用级别视觉感知/理解能力,甚至可以通过自然语言与人类进行无缝对话和互动。虽然多模态大模型的这些能力已经在多个视觉语…

[二叉树专题]判断平衡二叉树|二叉树所有路径|左叶子之和

一、判断平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 思路:自下而上递归方法,其遍历顺序是后序遍历…

Python中通过字符串访问与修改局部变量

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 在Python中定义一个函数时,就会把变量空间划分为全局变量(global)与局部变量(local), 如果是定义在一个类的成员函数中,那么就…

Ubuntu2204+ROS2(humble)+usb_cam内参标定

1、安装usb_cam包 pip install pydantic1.10.14sudo apt install ros-humble-usb-cam# 测试打开相机 ros2 launch usb_cam camera.launch.py# 显示图像 ros2 run image_view image_view image:/camera1/image_raw 2、安装 camera_calibration sudo apt install ros-humble-c…

爬虫学习笔记-get请求获取豆瓣电影排名多页数据★★★★★

1. 导入爬虫需要使用的包 import urllib.request import urllib.parse 2.创建请求函数 def create_request(page): # 定义不变的url部分 base_url https://movie.douban.com/j/chart/top_list?type5&interval_id100%3A90&action& # 根据规律定义data拼接url …

HCIA真机实验:三层交换机实现vlan之间的通信(内含配置命令)

基础实验示例: 最上面那个交换机作为三层交换机。 下面的两个交换机的配置与之前单臂路由实现vlan之间的通信的配置相同。在这个基础上开启三层交换机 在三层交换机上的配置: 1、创建vlan(底下的交换机有多少个vlan,则三层交换…

算法沉淀——前缀和(leetcode真题剖析)

算法沉淀——前缀和 01.一维前缀和02.二维前缀和03.寻找数组的中心下标04.除自身以外数组的乘积05.和为 K 的子数组06.和可被 K 整除的子数组07.连续数组08.矩阵区域和 前缀和算法是一种用于高效计算数组或序列中某个范围内元素之和的技巧。它通过预先计算数组的前缀和&#xf…

MyBatis详解(4) -- 动态SQL

MyBatis详解(4) 动态SQL两种方式:1.映射器配置文件; 2.注解常用的动态 SQL 元素if元素where元素set元素choose元素(优先,只执行一个)trim元素foreach 元素(批量处理)bind…

【云原生】docker-compose单机容器集群编排工具

目录 一、docker-compose容器编排的简介 二、docker-compose的使用 1、docker-compose的安装 2、docker-compose的配置模板文件yaml文件的编写 (1)布尔值类型 (2)字符串类型 (3)一个key有多个值 &am…

Linux——shell程序的简单实现

shell程序的简单实现 本章思维导图: 注:本章思维导图对应的.xmind和.png文件都已同步导入至资源,可免费查阅 在学习完有关进程的知识后,我们就可以开始尝试自己实现一个简单的shell程序了。 注:在编写简单的shell程…

Spring - 基本用法参考

Spring 官方文档 Spring容器启动流程(源码解读) BeanFactoryPostProcessor vs BeanPostProcessor vs BeanDefinitionRegistryPostProcessor: From java doc: BeanFactoryPostProcessor may interact with and modify bean defin…

openGaussdb5.0单点企业版部署_Centos7_x86

本文档环境:CentOS7.9 x86_64 4G1C40G python2.7.5 交互式初始化环境方式 介绍 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续…