一分钟快速排序

这个 quick_sort 函数是一个实现快速排序(Quicksort)算法的递归函数。快速排序是一种高效的排序算法,通常用于对大规模数据集进行排序。以下是对该函数的详细解释:

函数签名

void quick_sort(int q[], int l, int r)
  • q[]:要排序的数组。
  • l:数组的左边界索引。
  • r:数组的右边界索引。

基本思想

快速排序的基本思想是通过选择一个"基准"元素,将数组划分为两个子数组,使得左子数组中的所有元素都小于基准元素,右子数组中的所有元素都大于基准元素。然后递归地对两个子数组进行排序。

函数具体步骤

  1. 终止条件

    if (l >= r) return;
    

    如果左边界大于或等于右边界,说明子数组的长度为0或1,此时已经是有序的,直接返回。

  2. 初始化指针和基准元素

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    
    • ij 分别初始化为左边界的前一个位置和右边界的后一个位置。
    • x 是基准元素,通常选择中间位置的元素(这里使用 (l + r) >> 1 计算中间位置并作为基准)。
  3. 划分过程

    while (i < j)
    {do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);
    }
    
    • i 向右移动,直到找到一个不小于基准元素的元素。
    • j 向左移动,直到找到一个不大于基准元素的元素。
    • 如果 i 小于 j,则交换 q[i]q[j]
  4. 递归调用

    quick_sort(q, l, j), quick_sort(q, j + 1, r);
    
    • 对左子数组 q[l..j] 进行递归排序。
    • 对右子数组 q[j + 1..r] 进行递归排序。

代码解释

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){do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);}quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
  • if (l >= r) return;:递归终止条件。如果子数组长度为0或1,直接返回。
  • int i = l - 1, j = r + 1, x = q[l + r >> 1];:初始化左右指针和基准元素。
  • while (i < j):进入划分循环。
    • do i ++ ; while (q[i] < x);i 向右移动,直到找到一个不小于 x 的元素。
    • do j -- ; while (q[j] > x);j 向左移动,直到找到一个不大于 x 的元素。
    • if (i < j) swap(q[i], q[j]);:如果 i 小于 j,交换 q[i]q[j]
  • quick_sort(q, l, j), quick_sort(q, j + 1, r);:递归排序左、右子数组。

示例

假设输入数组为 [3, 6, 8, 10, 1, 2, 1],调用 quick_sort(q, 0, 6)

  1. 初始基准元素为中间值 8,通过划分将数组变为 [3, 6, 1, 1, 2, 8, 10]8 左边是小于 8 的元素,右边是大于 8 的元素。
  2. 递归对左子数组 [3, 6, 1, 1, 2] 和右子数组 [10] 进行排序。
  3. 最终得到排序后的数组 [1, 1, 2, 3, 6, 8, 10]

快速排序是一种高效的排序算法,平均时间复杂度为 O(n log n),但在最坏情况下(如输入已经有序时)时间复杂度为 O(n^2)。通过合理选择基准元素,可以在很大程度上避免最坏情况。

测试代码

#include <iostream>
#include <algorithm>
using namespace std;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){doi++;while (q[i] < x);doj--;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()
{int q[] = {3, 6, 2, 1, 7, 4, 5};quick_sort(q, 0, 6);for (int i = 0; i < 7; i++)cout << q[i] << ' ';return 0;
}

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

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

相关文章

Qt_电脑wifi相关操作

项目描述: 在做项目时用到了获取wifi的操作。在网上查找了好久资料,这里做一些总结。 这里有显示当前电脑wifi连接状态,列出wifi列表,连接断开wifi等函数。欢迎大家留言添加文章内容。 使用范围: windows电脑(中文的环境) 使用技术:windows的cmd命令。和对字符串的解析…

C语言学习笔记--运算符与表达式(7521字爆肝)

上午好&#xff0c;本来想上午改简历下午学习c语言的&#xff0c;但想了一下上午精力充沛还是用来学习比较好&#xff0c;虽然现在失业了&#xff0c;但住在我姨家有吃有住的&#xff0c;再次感谢我姨&#xff0c;我要抓紧时间修改简历&#xff0c;然后找个工作搬出去&#xff…

【回忆版】数据科学思维与大数据智能分析 2024考试

填空&#xff08;18分&#xff09;18个 1.对数变换对大数值的范围进行压缩&#xff0c;对小数值的范围进行扩展 2.提取出大量高频率项与低频率项相关联的虚假模式&#xff0c;即交叉支持&#xff08;cross-support&#xff09;模式 3.信息论中&#xff08;&#xff09; 4.几种…

[数据集][目标检测]弹簧上料检测数据集VOC+YOLO格式142张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;142 标注数量(xml文件个数)&#xff1a;142 标注数量(txt文件个数)&#xff1a;142 标注类别…

yolov8训练自己数据集时出现loss值为nan。

具体原因目前暂未寻找到。 解决办法 将参数amp改成False即可。 相关资料&#xff1a; https://zhuanlan.zhihu.com/p/165152789 https://github.com/ultralytics/ultralytics/issues/1148

【BUG】Edge|联想电脑 Bing 搜索报错“Ref A: 乱码、 Ref B:乱码、Ref C: 日期” 的解决办法

文章目录 省流版前言解决办法 详细解释版前言问题描述与排查过程解决办法与总结 省流版 前言 我也不清楚咋滴了&#xff0c;Bing 搜索突然偶尔报错&#xff1a; 换了代理关了插件都报错。 参考&#xff1a; 我在用bing搜索时出现了如下代码&#xff0c;导致bing无法使用&am…

nginx proxy_set_header详解

proxy_set_header 是 Nginx 配置中的一个重要指令&#xff0c;特别是在使用 Nginx 作为反向代理时。该指令允许你修改由 Nginx 传递给代理后端的请求头。这对于确保后端应用程序能够接收到正确的客户端信息&#xff08;如 IP 地址、主机名等&#xff09;以及控制缓存行为等场景…

1 计算机硬件-CPU-校验码-存储系统-输入输出设备-总线结构

计算机硬件 考情分析&#xff1a;趋势很小&#xff0c;22年考过&#xff0c;根据趋势以后考的可能较小 基本组成&#xff1a;运算器&#xff0c;控制器&#xff0c;储存器&#xff0c;输入设备&#xff0c;输出设备运算器和控制器也统称为中央处理单元&#xff08;CPU&#xf…

【算法训练 day37 柠檬水找零、长度最小的子数组、用最少数量的箭引爆气球】

目录 一、柠檬水找零-LeetCode 860思路实现代码个人问题总结 二、根据身高重建队列-LeetCode 406思路实现代码个人问题总结 三.用最少数量的箭引爆气球-LeeCode 406思路实现代码个人问题总结 一、柠檬水找零-LeetCode 860 Leecode链接: leetcode 860 文章链接: 代码随想录 视频…

解锁Nginx跨域谜题:3步打造安全高效的CORS策略

Nginx作为一款强大的Web服务器和反向代理服务器&#xff0c;经常被用于处理跨域资源共享&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;策略&#xff0c;以允许或限制不同源之间的资源请求。CORS是一种安全策略&#xff0c;用于决定Web浏览器是否应允…

深度学习——图像分类(CNN)—测试模型

测试模型 1.导入必要的库2.加载测试数据集3.假设CSV文件中的图像文件名是完整的路径4.随机选择一张图片进行展示5.加载图像6.使用模型进行预测7.设置模型的预测结果8.计算准确率9.指定test文件夹路径10.读取名为image_path的图片11.加载图像12.检查图像是否为空 训练的模型是上…

eNSP学习——OSPF单区域配置

目录 相关命令 实验背景 实验目的 实验步骤 实验拓扑 实验编址 实验步骤 1、基础配置 2、部署单区域OSPF网络 3、检查OSPF单区域的配置结果 OSPF——开放式最短路径优先 基于链路状态的协议&#xff0c;具有收敛快、路由无环、扩展性好等优点&#xff1b; 相关命令 […

【JAVA基础之内部类】匿名内部类

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;小林同学的专栏&#xff1a;JAVA之基础专栏 目录 1.内部类 1.1 概述 1.1.1 什么是内部类 1.1.2 什么时候使用内部类 1.2 内部类的分类 1.3 成员内部类 1.3.1 获取成员内部类对象的两种方式 1.3.2 经典面试…

用C语言把一棵普通二叉树安排得明明白白

1. 树的相关术语 结点的度&#xff1a;一个结点含有的子树的个数称为该结点的度&#xff1b; 如上图&#xff1a;A的为6 叶结点或终端结点&#xff1a;度为0的结点称为叶结点&#xff1b; 如上图&#xff1a;B、C、H、I...等结点为叶结点 非终端结点或分支结点&#xff1a;度不…

【Linux】-Tomcat安装部署[12]

目录 简介 安装 安装部署JDK环境 解压并安装Tomcat 简介 Tomcat是由Apache开发的一个Servlet容器&#xff0c;实现了对Servlet和JSP的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#…

使用 mysql-binlog-connector 监听处理 MySQLBinlog 文件

1. 需求概述 业务开发中经常需要根据一些数据变更实现相对应的操作。例如&#xff0c;一些用户注销自己的账户&#xff0c;系统可以给用户自动发短信确认&#xff0c;这时有两种解决方案&#xff0c;一种是耦合到业务系统中&#xff0c;当用户执行注销操作的时候&#xff0c;执…

【软件工程】【23.10】p2

关键字&#xff1a; 软件复用技术、过程途径、特定需求是文档核心、数据字典条目、高内聚低耦合独立性、数据流图映射模块结构图、UML依赖、用例图关系、RUB迭代、程序规格说明等价类划分、有效性测试的目标、喷泉模型面向对象、软件验证过程、CMMI

算法提高之程序自动分析

算法提高之程序自动分析 核心思想&#xff1a;并查集 离散化 因为不是每个数都会用到 所以离散化一下**(不需要保留顺序)**对于每一个值为1的等式 优先处理之后处理值为0的等式时 若ab已经连在一起 即为矛盾 #include <iostream>#include <cstring>#include &l…

【Linux】Centos7安装RabbitMQ

【Linux】Centos7安装RabbitMQ 下载 从 rabbitmq 的 GitHub 仓库下载 https://github.com/rabbitmq/rabbitmq-server/releases rabbitmq 是 erlang 语言编写的&#xff0c;需要先安装 erlang https://github.com/rabbitmq/erlang-rpm/releases 安装 使用rz命令上传 erlang 和 …

Polar 网站被黑

Polar 网站被黑 开题&#xff0c;挺好看的前端&#xff0c;可惜啥也没有。 信息搜集一波&#xff0c;扫目录出现几个敏感目录&#xff0c;但是没什么用。 继续搜集&#xff0c;在返回包中发现了HINT F5XDAXZQNZSV6ZRRNZSF63JTF4base32解码后是一个路由/n0_0ne_f1nd_m3/&#x…