排序算法大比拼(2.2)——时间O(n log2n)篇之快速排序(左右指针法)
文章目录
- 概述
- 算法思路
- 动画演示
- 代码实现
- 算法特点
概述
快速排序是对冒泡排序的一种改进,也是当前人们认为综合效率最好的排序算法。
下面,让我们一起来学习最基本的快速排序叭~
建议大家先看看第一篇和第二篇。
算法思路
我们需要先找一个基准数k。在最基本的快速排序中,k可以是序列中的第一个数。
对于左指针,一个元素合法的定义是:这个数≤k。
左指针向后遍历不停地向后遍历,寻找第一个不合法的数。
3, 7, 1 ≤ 8,
10 ≥ 8。
左指针第一个不合法的数就是a[4] = 10。对于右指针,一个元素合法的定义是:这个数≥k(和k值相等的数在那边都可以)。
在右指针那里,第一个数6就 < 8,不合法。
为了使得这两个数合法,我们把它们交换一下~
我们按照刚才的步骤再操作一次,又得到了两个不合法的数。
交换后,整个序列都合法了。
此时的a数组被分成的两个部分:<k,和≥k的。
我们可以序列分为两部分,每部分继续执行刚才的操作,直到整个序列有序。
动画演示
为方便大家理解,蒟蒻君给大家找了个动画。
这个动画与上述方法唯一不同的就是,基准数放到最后了。但本质还是没变。
代码实现
void quick_sort(int a[], int l, int r) { // l, r表示排序范围 // 递归终止条件:序列为空if (l > r) {return;}int i = l, j = r, k = a[l];while (i != j) {// 一定要先确定右指针,因为这样从而就能确定左指针遍历的范围。 while (a[j] >= k && i < j) { // 右指针如果元素合法就一直向左遍历,停下的时候就是第一个不合法的元素--j;}while (a[i] <= k && i < j) { // 左指针同理 ++i;}swap(a[i], a[j]); // 即使i == j,交换也不会影响结果 }// 基准数归位a[l] = a[i];a[i] = k;// 将这一段数分为两段处理quick_sort(a, l, i - 1); // 继续处理左边的,这里是一个递归的过程quick_sort(a, i + 1, r); // 继续处理右边的 ,这里是一个递归的过程
}
算法特点
- 每次将序列分成两部分用O(log2n),共分n次,最优/最差/平均时间复杂度O(n log2n)。
- 原地排序,空间复杂度O(1)。
- 因为基准数选择较随意,在快速排序里算比较慢的了(所有种类快速排序本质不会差太多,所以时间复杂度都会写成O(n log2n)。
排序算法大比拼(2.2)——时间O(n log2n)篇之快速排序(左右指针法)相关推荐
- 排序算法大比拼(2.1)——时间O(n log2n)篇之归并排序
文章目录 排序算法时间O(n log2n)篇概述 算法思路 动画演示 代码实现 算法特点 总结 排序算法时间O(n log2n)篇概述 在排序算法中,平均时间O(n log2n)是除特殊排序算法之外最 ...
- 排序算法 之四 分类、时间/空间复杂度、如何选择
写在前面 现在网上关于排序算法的文档不计其数,为什么要写这篇文章呢?主要是因为一些算法虽然在平时有用到,但是从来没有细细整理过,没有个统一.整体的认识.写这篇文章一来是进行一下总结,二来趁机再系统 ...
- 12八大排序算法的稳定性以及时间空间复杂度总结
文章目录 一.排序的稳定性 二.八种排序方式的复杂度和稳定性 三.总结 一.排序的稳定性 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中 ...
- 【八大排序(五)】快排进阶篇-挖坑法+前后指针法
- python 十大经典排序算法
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...
- 十大经典排序算法Python版实现(附动图演示)
来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...
- 统治世界的十大排序算法!
来源:https://www.cnblogs.com/onepixel 0 算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不 ...
- 一文读懂Python版的十大经典排序算法(附动图演示)
来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...
- 利用Python实现十大经典排序算法(附代码流程)
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:hustcc 来源:https://github.com/hustcc/JS ...
最新文章
- IE 无法点击文本框或输入文字
- git修改远程仓库关联
- php 删除文件时间,php删除文件后重建,文件创建时间(filectime)未变化怎么解决??...
- Oracle数据库权限管理
- linux uname 命令 打印系统信息
- Game as a Service —— 开源云游戏搭载WebRTC
- permgen_打破PermGen神话
- 如何理解CPU上下文切换(二)
- FreeRTOS基础认识
- visio中画细箭头
- 跨步电压 matlab仿真,跨步电压,跨步电压触电,跨步电压法,论文集锦_发表网
- 谷歌浏览器上不了网如何设置_如何解决电脑网络连接正常却上不了网
- Edsger W. Dijkstra -- 巨人的肩膀
- 通过爬虫获取免费IP代理,搭建自己的IP池(https)
- 如何有效规避程序化交易的滑点?
- Linux嵌入式开发必读推荐书籍
- mcpe服务器网页控制台教程,mcpe服务器指令
- ImportError: No module named 'win32api'
- 解决sourcetree特别卡的问题
- 计算机组成原理实验一报告——运算器