蓝桥杯基础算法(一)—— 快速排序

news2024/9/21 12:28:55

文章目录

  • 1. 基本思想
  • 2. 图解过程
  • 3. 代码模板
  • 4. 例题讲解
    • 🍑 快速排序
    • 🍑 第 k 个数


1. 基本思想

快速排序是 Hoare 于 1962年 提出的一种二叉树结构的交换排序方法。

其基本思想为:

(1)确定分界点:在数组中选出一个 key,一般是最左边的值、中间的值或是最右边的值都可以。

(2)调整区间:使得区间左边所有的数都小于等于 key,区间右边的所有的数都大于等于 key。

(3)递归处理左右两段,也就是把左右分别排序(左边的最大值一定是小于右边的最小值)

2. 图解过程

快排的思想很容易理解,难点在于如何调整区间?

首先我们选取最左边的值为 key,然后定义两个指针 i 和 j。

i 在区间的最左边,指向 left 的前一位,j 在区间的最右边指向 right 的后一位。

在这里插入图片描述

接着 i 先走,向中间移动,如果遇到比 key 大的值就停下来,然后 j 再向中间移动,如果遇到比 key 小的值就停下来,最后交换指针 i 和指针 j 指向的值。

在这里插入图片描述

然后 i 和 j 又继续往中间走,此时 i > j,那么我们就停下来。

在这里插入图片描述

最后我们又可以重新划分区间,又重新递归左区间 left, j 和右 j + 1, right

在这里插入图片描述

3. 代码模板

代码示例

void quick_sort(int q[], int l, int r)
{
	if (l >= r)
		return;

	int i = l - 1, j = r + 1, x = q[l + r >> 1];

	while (i < j)
	{
		// i找比x大的
		while (q[++i] < x);
		// j找比x小的
		while (q[--j] > x);
		// 走到这里,直接交换i和j下标指向的元素
		if (i < j)
			swap(q[i], q[j]);
	}

	// 递归左区间
	quick_sort(q, l, j);

	// 递归右区间
	quick_sort(q, j + 1, r);
}

i,j 是一个待排序区间的左右指针,x 是用来分界的值,这里选了中间点的值

初始化 i,j 分别为左边界的左边和右边界的右边,方便后面先递增和递减的操作

然后 >> 移位运算符,往右移 1 就表示对应数值的二进制表示往右移动 1,在数学意义上相当于数值除以 2 的下取整。

递归查找的思路很简单:

因为当 i 指针和 j 指针相遇或错过(i 跑到了 j 后面一格,一定是一格)之后,i 和 j 指针一定都无法再次满足 while 条件。

那么,此时数组的实际情况一定是 j 左边的(包括 j)小于等于哨兵元素,

i 右边的(包括 i)大于等于哨兵元素,而 i 一定是 要么等于 j,要么等于 j + 1,

因此,以 j 和 j + 1 作为分界。

4. 例题讲解

🍑 快速排序

(1)题目描述

在这里插入图片描述

(2)代码实现

#include <iostream>
using namespace std;

const int N = 1e5+10;

int n;
int q[N];


void quick_sort(int q[], int l, int r) {
    if (l >= r) return;
    
    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    
    while (i < j)
    {
        while (q[++ i] < x);
        while (q[-- j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    
    quick_sort(q, l, j);
    quick_sort(q, j+1, r);
}


int main()
{
    scanf("%d", &n);
    
    for (int i = 0; i < n; ++i) scanf("%d", &q[i]);
    
    quick_sort(q, 0, n-1);
    
    for (int i = 0; i < n; ++i) printf("%d ", q[i]);
    return 0;
}

🍑 第 k 个数

(1)题目描述

在这里插入图片描述

意思就是:在这个数组种,找到第 3 小的数,那么输出结果就算 3。

(2)解题思路

我们先来回顾一下快排的思路:

1)找到分界点 x(q[L]、q[(L + R) / 2]、q[R] 这三个都可以当分界点)

2)使得左边所有的数小于等于 x(left <= x),右边所有的数大于等于 x(right >= x

3)递归排序左右区间

这道题不一样的地方在于它可以利用快排模板,但却不需要真的把所有数据排序完成,每次一分为二后,只关心自己所有的那一半,就是可以节约一半的递归时间。

当我们实现完前两步以后,现在已经把左右区间划分好了,由于左边所有的数肯定是小于等于右边所有的数,

因此左半段里面的数就是整个区间最小的数,我们统计左半段的个数,记为 SL。

同样把右半段的个数记为 SR。

在这里插入图片描述

那么此时我们就可以分情况讨论:

1)如果 k <= SL,那么第 k 小的数一定在左半边,因此我们只需要递归处理左边。

2)如果 k > SR,那么第 k 小的数一定在右半边,因此我们只需要递归处理右边,那么整个区间第 k 小的数就是右半边的第 k - SL 小的数

这个其实是由快速排序演变来的,只是我们只能选择递归某一边。

位置这个参数不是一成不变的,因为如果在左侧,那么就是原来的位置,如果在右侧,那就需要减去整个左侧的长度。

这个 k 参数可以理解为 “在当前数组中的位置”,最终将确定这个位置上的值。

时间复杂度: O ( n ) O(n) O(n)

(3)代码实现

#include <iostream>
using namespace std;

const int N = 1e5+10;

int n, k;
int q[N];

int quick_sort(int l, int r, int k) {
    if (l == r) 
        return q[l];
    
    int x = q[l], i = l - 1, j = r + 1;
    
    while (i < j)
    {
        while (q[++ i] < x);
        while (q[-- j] > x);
        
        if (i < j) 
            swap(q[i], q[j]);
    }
    
    int sl = j - l + 1;
    
    if (k <= sl) //如果第K个数在左半边,就排左半边,
        return quick_sort(l, j, k); 
    
    return quick_sort(j + 1, r, k - sl); //否则就排右半边。
}

int main()
{
    cin >> n >> k;
    
    for (int i = 0; i < n; ++i) cin >> q[i];
    
    cout << quick_sort(0, n - 1, k) << endl;
    
    return 0;
}

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

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

相关文章

从零开始的MySQL(1)

目录1.MySQL的安装2.MySQL的基本操作2.1 展示数据库2.2 创建数据库2.3 选中数据库2.4 删除数据库2.5 常用数据类型2.5.1 整形2.5.2 浮点数2.6 创建表2.7 查看表2.7 查看表结构2.8 删除表3.数据库增删改查3.1 单行插入3.2 多行插入3.3 插入日期3.4 select查询3.4.1 select3.4.2 …

Jprofiler监控服务器的cpu

现象&#xff1a;压测过程中&#xff0c;发现应用服务器的cpu使用率比较高>80%&#xff0c;我们就可以判断服务器的cpu使用率太高了。 一般cpu太高有两种情况&#xff0c; 1.接口的性能非常好&#xff0c;比如响应时间<10ms&#xff0c;tps很高&#xff0c;此时的cpu使用…

CSDN官方插件猿如意可以用ChatGPT啦!

什么是 ChatGPT Chat GPT 是一种由 AI 技术驱动的自然语言处理工具&#xff0c;可让您与聊天机器人进行类似人类的对话等它是基于OpenAI的GPT-3架构进行构建的&#xff0c;并经过训练&#xff0c;以便能够回答人类的问题并进行自然对话ChatGPT可以回答关于各种话题的问题&#…

基于SSM广州旅游攻略网站的设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

【Unity】摄像机跟随鼠标移动以物体为中心旋转 物体根据视线方向移动

描述 实现摄像机根据鼠标移动跟随物体旋转&#xff0c;以摄像机前物体为中心&#xff0c;摄像机围绕物体旋转&#xff0c;并使摄像机时刻指向物体 实现效果 Unity 组件设置 Camera 组件设置 Body 组件设置 实现代码 CameraRotateMove.cs 摄像机跟随和旋转 using System.Co…

神经网络常用的训练方式,什么是神经网络训练法

1、神经网络中的模型训练是什么意思? 无导师学习网络 神经网络中的模型训练是通过自动寻找样本中的内在规律和本质属性,自组织、自适应地改变网络参数与结构。 神经网络在系统辨识、模式识别、智能控制等领域有着广泛而吸引人的前景&#xff0c;特别在智能控制中&#xff0c;…

寄存器内存读写指令(二) —— 多寄存器读写 LDM / STM

有的时候&#xff0c;CPU可能会遇到 a; b; c&#xff0c;这个时候为了提升效率&#xff0c;CPU可能会一次将多个寄存器里的变量保存到内存中。这个时候之前介绍的 LDR / STR 指令虽然也能实现&#xff0c;但只能操作一个寄存器的读写。 因此&#xff0c;考虑到这点&#xff0c…

基于FPGA的PWM发生器设计

目录 引言 设计说明 设计特点 设计思路 设计源码 整数除法模块

超级好看的 Edge 浏览器新标签页插件:好用、好看、免费浏览器必备

BdTab 新标签页 BdTab新标签页扩展是一款免费无广告、简单好用的的高颜值新标签页扩展。 BdTab它颜值高、简单好用、支持高度自定义&#xff1a; 在登录之后支持云备份&#xff0c;支持快速切换搜索引擎&#xff0c;支持快速查看浏览历史记录和书签&#xff0c;用起来非常方便…

数据结构与算法——Java实现排序算法(一)

目录 一、排序算法 1.1 排序算法基本介绍 1.2 衡量程序执行的方法 1.2.1 事后统计法 1.2.2 事前估算的方法 二、 时间复杂度 2.1 时间频度 2.2 时间复杂度 2.2.1 常见的时间复杂度 2.2.2 常数阶O(1) 2.2.3 对数阶O(log2底n) 2.2.4 线性阶O(n) 2.2.5 线性对数阶O(n…

2022年PAT冬季甲级考试 25 A-3 Articulation Points

A-3 Articulation Points 分数 25 In graph theory, given a connected graph G, the vertices whose removal would disconnect G are known as articulation points. For example, vertices 1, 3, 5, and 7 are the articulation points in the graph shown by the above fi…

WAYON维安功率肖特基二极管,适配器领域的助推器

WAYON维安功率肖特基二极管&#xff0c;适配器领域的助推器。 维安功率肖特基二极管&#xff0c;适配器领域的助推器 导言 肖特基二极管&#xff0c;是以它的发明人肖特基博士名字而命名的&#xff0c;又被称作是肖特基势垒二极管。它是金属与半导体材料相互接触&#xff0c;且…

C++:类和对象:C++对象模型和 this指针

1&#xff1a;成员变量和成员函数分开存储 在C中&#xff0c;类内的成员变量和成员函数分开存储&#xff0c;只有非静态成员变量才属于类对象。 案例&#xff1a;我们写一个空类&#xff0c;然后创建一个对象&#xff0c;看看这个空对象占用多大空间。 #include<iostream…

做全表扫描时数据表的内存大于 MySQL 内存,会不会被打爆?

我查这么多数据&#xff0c;会不会把数据库内存打爆&#xff1f; 我的数据库内存只有10G&#xff0c;现在我要对一个20G的大表做全表扫描&#xff0c;会不会把数据库内存&#xff08;buffer pool&#xff09;占满然后报OOM的错误&#xff1f; 答案是不会的。 InnoDB的数据是…

【图像处理 -1图像恢复】非线性过滤器修复图像

【论文参考】文章地址&#xff1a; https://www.researchgate.net/publication/303996052_Image_Restoration_Technique_with_Non_Linear_Filter Image Restoration 一、摘要 在本文中&#xff0c;提出了一种新的处理方法图像使用不同的过滤方法 实现Image恢复。目的是增强数…

计算机网络原理第4章 网络层

目录~ 4.1 网络层提供的两种服务 面向连接&#xff1a;让网络负责可靠交付&#xff0c;通信之前先建立虚电路 无连接&#xff1a;网络提供数据报服务&#xff0c;网络层提供简单灵活的、无连接的、尽最大努力交付的数据报服务 4.2 网际协议 IP 网际协议 IP 是 TCP/IP 体系…

基于JAVA的校友录

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系我们、校园通知、组织信息、活动信息 管理员功能&#xff1a; 1、管理关于我们、联…

java方法耗时统计,JavaAgent javassist bytebuddy统计方法耗时,jvm监控prometheus

前言介绍 JavaAgent是在JDK5之后提供的新特性&#xff0c;又叫叫java代理。开发人员可通过这种机制(Instrumentation)在jvm加载class文件之前修改类的字节码&#xff0c;动态更改类方法实现AOP&#xff0c;提供监控服务如&#xff1a;方法调用时长、jvm内存等。修改字节码领域…

jsp+ssm计算机毕业设计大学生校园新闻发布系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

色温及其相关参数

光学膜层和大多数着色表面不是自发光的。为了看到它们&#xff0c;我们需要一个光源。显然&#xff0c;对颜色的任何评估都将包括光源的属性。在计算颜色时&#xff0c;我们通常使用标准光源&#xff0c;其中大部分是由CIE根据其相对光谱输出来定义的&#xff0c;并且尽可能地表…