快速排序(c++)

server/2025/2/28 21:02:57/

快速排序是目前应用最广泛的排序算法之一,"它的基本思想与归并排序类似,也是基于分治的。每次从待排序区间选取一个元素(我们在后面的课程中都是选取第一个)作为基准,所有比基准小的元素都在基准的左边,而所有比基准大的元素都在基准的右边。之后分别对基准记录的左边和右边两个区间递归地进行快速排序

int a[100005];
void quick_sort(int l, int r) {if(l >= r){return;}int p1 = l, p2 = r;int pivot = l;while(p1 < p2){while(a[p2] >= a[pivot] && pivot < p2){p2--;}if(pivot < p2){swap(a[pivot], a[p2]);pivot = p2;}while(a[p1] <= a[pivot] && pivot > p1){p1++;}if(pivot > p1){swap(a[pivot], a[p1]);pivot = p1;}}quick_sort(l, pivot - 1);quick_sort(pivot + 1, r);
}

上述代码中,如果当前区间只有一个元素或为空,就直接返回。
p1 和 p2 是两个用于扫描的指针,分别从左往右和从右往左扫,直到他们相遇为止。每一轮可以看作两步:
    1.自右向左扫找到右边第一个小于基准的位置后交换;
    2.自左向右扫找到左边第一个大于基准的位置后交换;
这样一轮结束后,基准值被落在了正确的位置,之后递归地对左边和右边的元素做快速排序即可 

可以证明快速排序的平均时间复杂度为 (n log n),最坏情况下时间复杂度为 (n ^ 2),可以通过随机选择基准记录来尽可能避免最坏情况的出现。

快速排序是不稳定的排序算法

快速选择 

快速选择是基于快速排序算法查找第 k 小(大)数的问题
原理: 每一轮快速排序的过程中:
  左边所有数<基数;
  右边所有数 >= 基数;
那么在每一轮排序的过程中基数的位置就是排序后该数的位置

如果我们现在想要求解第 k 小的数,每次让 k 和排序后基数的位置 id 进行比较,若
  k = id,找到第k 小的数;
  k < id,在左区间内递归求解;
  k > id,在右区间内递归求解;
例如k = 6时: 

因为快速选择是基于快速排序算法,平均时间复杂度为 O(n),最坏情况下时间复杂度为 (n ^ 2)。  

代码展示

#include <algorithm>
#include <iostream>
using namespace std;
int a[100005];
void quick_sort(int l, int r) {if(l >= r){return;}int p1 = l, p2 = r;int pivot = l;while(p1 < p2){while(a[p2] >= a[pivot] && pivot < p2){p2--;}if(pivot < p2){swap(a[pivot], a[p2]);pivot = p2;}while(a[p1] <= a[pivot] && pivot > p1){p1++;}if(pivot > p1){swap(a[pivot], a[p1]);pivot = p1;}}quick_sort(l, pivot - 1);quick_sort(pivot + 1, r);
}
int main() {int n;cin >> n;for (int i = 0; i < n; i++) {cin >> a[i];}quick_sort(0, n - 1);for (int i = 0; i < n; i++) {cout << a[i] << " ";}return 0;
}

 


http://www.ppmy.cn/server/171382.html

相关文章

数据在内存中的存储

数据在内存中的存储 一 . 整数在内存中的存储1.1整型的表示方法1.2为什么对于整形在内存中要存放补码? 二 . 大小端字节序和字节序判断2.1什么是大小端字节序?2.2大小端字节序的概念2.3如何判断当前机器的大小端字节序 三 . 浮点数在内存中的存储3.1 占据32位的浮点数3.1.1有…

网络安全与等保2.0

等保等级标准 信息系统按照重要性和受破坏后的危害性进行分级 第一级自主安全防护级&#xff1a;信息系统受到破坏后&#xff0c;会对公民、法人和其他组织权益造成损害&#xff0c;但不损害国家安全、社会秩序和公共利益。 第二级审计安全保护级&#xff1a;信息系统受到破坏…

Spring-boot3.4最新版整合swagger和Mybatis-plus

好家伙,今天终于开始用spring-boot3开始写项目了&#xff0c;以后要彻底告别1.x和2.x了&#xff0c;同样的jdk也来到了最低17的要求了,废话不多说直接开始 这是官方文档的要求jdk最低是17 maven最低是3.6 一. 构建工程,这一步就不需要给大家解释了吧 二. 整合Knife4j 1.大于…

flutter-渐变色边框和渐变色文字和渐变色背景

文章目录 1. 介绍2. 代码实现2-1. 渐变色背景2-2. 渐变色边框2-3. 宽高由内容撑起的渐变色边框2-4. 渐变色文本 3. 完整例子 1. 介绍 在 flutter 中&#xff0c;渐变有三种&#xff0c;线性渐变 LinearGradient、放射状渐变 RadialGradient、扇形渐变 SweepGradient。一般都是…

OpenCV(11):人脸检测、物体识别

1 人脸检测 人脸检测是计算机视觉中的一个经典问题&#xff0c;而 OpenCV 提供了基于 Haar 特征分类器的人脸检测方法&#xff0c;简单易用且效果显著。本文将详细介绍如何使用 OpenCV 中的 cv2.CascadeClassifier() 进行人脸检测。 1.1 Haar 特征分类器 Haar 特征分类器是一种…

docker简介-学习与参考

docker Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱…

DavGo简单部署WebDAV服务

目录 功能特性使用方法1. 下载2. 配置 config.yaml3. 运行服务器4. 可以用来挂载WebDav的软件 反向代理 DavGo 是一个用 Go 语言实现的轻量级 WebDAV 服务器&#xff0c;支持动态配置多个 WebDAV 服务实例&#xff0c;每个实例可以独立设置根目录、认证信息和读写模式。 功能特…

git使用之git stash

使用场景&#xff1a; 1.其他分支提交代码到主分支&#xff0c;导致项目报错&#xff0c;想拉取远程代码但是本地的代码暂时不想提交&#xff1b; 2.切换分支处理其他任务 概括&#xff1a;不想提交本地代码时使用 使用&#xff1a; 1.查看stash记录 git stash list 2.暂…