C++快速排序的实现(注释超详细)

c++十大排序——快速排序 算法基本知识铺垫 有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下: 1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序 2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。 3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储 空间进行比较和交换的数据排序。 4、非原地排序:需要利用额外的数组来辅助排 阅读详情
AI摘要

本文详细介绍了C++中快速排序的实现方法,包括快速排序的基本思想、时间与空间复杂度分析,以及通过随机选取主元来提高算法稳定性的技巧。通过具体代码示例展示了如何进行分区操作,并提供了完整的快速排序实现。

C++快速排序的实现

1、QuickSort.h

/* 初始版本,升序排序 */
/* 时间复杂度:最好O(nlbn),平均O(nlbn),最坏0(n^2)
   空间复杂度:O(lbn) 递归栈最大深度为[lbn] + 1
   不稳定:情况基于每次划分选择的主元。随机化快排得到理论最坏情况的可能性仅为1/(2^n)
/*
* 快排思想:
* 1. 随机选取一个主元作为基准,从待排序记录序列左右两端开始,逐渐向中间靠拢,交替与主元比较、交换
* 左侧记录大于主元则交换,右侧记录大于主元则交换,交换后向中间靠拢
* 最后,主元到达它的最终位置
* 2. 对主元左右两个区域重复上述快速排序过程,结果分别让左右两个区域中的主元到达它们的最终位置
* 同时将待排序记录序列分成更小的待排序区域,再次对每个区域进行一趟快速排序,直到每个区域只有一个记录为止
*/

#ifndef QUICKSORT_H
#define QUICKSORT_H
#include <stdlib.h>

/* 从0开始,n为数组大小 */
int Partition(int arr[], int n)
{
    int pos = 0 + rand() % n;    // 随机选取主元 a + rand() % b = [a, b) 随机一个整数
    int main = arr[pos];       // 记录主元的值,后面将主元放置于最中间

    int low = 0, high = n - 1;
    std::swap(arr[0], arr[pos]);      /*  TODO :将主元跟最低位置的元素交换,这一步很重要 */
    while(low < high)   // 比较完毕之后,主元应该放置到的位置就是low == high,因为low == high时比较完毕,左边的比主元小,右边的比主元大,这就是主元所处的位置。
    {
        /* 必须从右边开始,因为要确保low == high时,arr[low]的值必须小于主元。即保证low == high右侧的元素大于等于主元。
        若从左边开始,则应先将主元与最高位置的元素交换      */
        while(low < high && arr[high] >= main)  // 找到右边区域比主元小的数
            --high;

        while(low < high && arr[low] <= main)   // 找到左边区域比主元大的数
            ++low;

        if(low < high)
            std::swap(arr[low], arr[high]); // 交换值
    }

    arr[0] = arr[low];  /* arr[0]保存的是主元的值,在循环中没有经过交换,而arr[low]的值小于主元,所以要把arr[low]放到主元左边 */
    arr[low] = main;	// 再把主元归位,记住此处 low == high
    return low;
}

void QuickSort(int arr[], int n)
{
    if(n <= 1)
        return;
    if(n > 1)
    {
        int p = Partition(arr, n);        // 选取一个主元,交换左右区域数据
        /* 去掉注释可以查看快排内部过程 */
        // std::cout << std::endl;
        // for(int i = 0; i < p; ++i)
        //     std::cout << arr[i] << " ";
        // std::cout << "**" << arr[p] << "** ";
        // for(int i = 0; i < n - p - 1; ++i)
        //     std::cout << arr[p + 1 + i] << " ";
        QuickSort(arr, p);                // 对左边区域进行快速排序
        QuickSort(arr + p + 1, n - p - 1);       // 对右边区域进行快速排序
    }
}


#endif // QUICKSORT_H

2、main.cpp

#include <iostream>
#include <stdlib.h>
#include "QuickSort.h"

#define MAX 10           // 随机数的最大数
#define MIN 1            // 随机数的最小数
#define MAXSIZE 10       // 数组大小
#define SORTTIMES 100    // 随机生成数组并进行排序的次数

int main(int argc, char *argv[])
{
    int arr[MAXSIZE];
    int i = SORTTIMES;
    while(i--){
        for(int i = 0; i < MAXSIZE; ++i)
        {
           arr[i] = (MIN + (int)MAX * rand() / (RAND_MAX + 1)); // 生成随机数组
           std::cout << arr[i] << " ";         // TODO : 输出生成的随机数,可注释掉
        }

        QuickSort(arr, MAXSIZE);            // 排序
        std::cout << "\t ==> \t";

        for(int i = 0; i < MAXSIZE; ++i)
            std::cout << arr[i] << " ";
        std::cout << std::endl;
    }
}

测试结果:

排序不得不看之:C++归并排序(注释超详细)

排序不得不看之:C++堆排序的实现(超详细)

c++实现快速排序算法 直接上代码: #include<iostream> using namespace std; //三个参数:要排序的数组,数组最左边的数下标和最右边的数下标 void quickSort(int a[], int left, int right) { if (left < right) {//如果左边的数下标不小于右边的数下标则结束排序 //声明三个变量用来存放当前循环的数组,l为最左边的数,r为最右边的数,temp为第一个数值作为参考值(称为主元) int l = left, 阅读详情

相关推荐

C++实现快速排序(可以通过leetcode!)

C++实现 快速排序(可以通过leetcode!)起因代码一代码二代码三如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 起因 我本是一个默默刷题的小菜鸡,从没想到自己会有写博客的一天。故事是这样的,在leetcode做到了和选择排序思想相关的题目,便想着先复习(学习)选择

weixin_44270621的博客 722

C++实现 快速排序

函数定义了两个指针 left 和 right,分别初始化为 strat 和 end。接下来,左右指针开始分别从左侧和右侧遍历数组arr,找到需要交换的元素并将其交换位置。left++;right--;第一个while循环,left指针一直往右移动,直到找到大于pivot与arr[right]应该交换的元素。第二个while循环,right指针一直往左移动,直到找到小于pivot与arr[left]应该交换的元素。

weixin_59043381的博客 1万+

【算法】快速排序的艺术:从理论到C++高效实现

快速排序(QuickSort)作为一种经典的分治算法,因其高效性和优雅的设计在计算机科学中占据重要地位。本文深入探讨了快速排序的理论基础、算法实现以及在C++中的高效编码实践。文章首先从数学角度分析快速排序的时间复杂度,推导其平均时间复杂度为 \(O(n \log n)\),并通过LaTeX公式展示关键步骤。接着,我们通过C++实现了一个完整的快速排序算法,包括选择基准元素、划分数组和递归排序的详细代码,并附带中文注释以便理解。此外,文章探讨了快速排序的优化策略,如三数取中法和尾递归优化,以提升性能和避免栈

一个被知识诅咒的人 1235

快速排序算法C++实现(超详细解析!!!!)

快速排序,其实是一种分治算法,那么在了解快速排序之前,我们先来看看什么是分治算法。在算法设计中,我们引入分而治之的策略,称为分治算法,其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题,分而治之。

weixin_45031801的博客 11万+

C++算法之快速排序

将待排序序列按照分界点的值重新排列,使得左边部分小于等于分界点,右边部分大于等于分界点。其主要思想就是将待排序的数组分成两个子数组,然后对这两个子数组分别进行排序,最后将已排序的子数组合并成一个有序的数组。注意上面的quick_sort( )函数是不一样的,在第二个函数里。否则会造成边界问题。同理右边届也存在这种问题。如果没有swap( )函数可以使用。归并排序的主要思想:分治。

m0_74739134的博客 1254

C++实现快速排序算法:分治法精讲

快速排序是一种高效的排序算法,由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。快速排序算法的时间复杂度在最坏情况下是O(n²),但在平均情况下,时间复杂度为O(nlogn),因此它在数据量较大时表现得非常出色。由于其高效的性能,快速排序算法是许多编程语言中排序函数的内部实现方法,例如C++的std::sort和Python的等。

weixin_32673065的博客 1078

C++归并排序(注释超详细)

C++归并排序的实现1、MergeSort.h/* 初始版本,升序排序 */ /* 时间复杂度:O(nlbn) 将n个待排序记录归并次数为lbn,一趟归并O(n) 空间复杂度:O(n) 递归栈最大深度为[lbn] + 1 ,而辅助数组大小为n 稳定:无论最好还是最坏情况时间复杂度都是O(nlbn) */ #ifndef MERGESORT_H #define MERGESORT_H ...

Spade_的博客 3万+

项目管理中 PMO 的关键职能解析

在企业数字化转型与战略落地的浪潮中,PMO(Project Management Office,项目管理办公室)逐渐从“项目辅助角色”升级为“组织级战略执行中枢”。然而,多数人对PMO的认知仍停留在“管项目的部门”或“文档审核机器”的层面。本文将打破误解,通过生活化类比(如“中枢神经”“导航系统”)、流程图解(战略对齐循环)、实际案例(制造企业PMO升级),深入解析PMO的五大核心职能:战略对齐、流程标准化、资源管理、绩效监控、知识沉淀。最终揭示PMO的本质——

项目管理的博客 1250

快速排序 C/C++

快速排序 C/C++ 我们日常学习中排序有最简单的冒泡排序,虽然方便就可以写出来,但是时间复杂度太大 对于一些题来说很容易超时;所以便有了快速排序~~~ 快速排序(Quicksort): Quicksort 对冒泡排序算法的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

weixin_53523248的博客 2503

测绘无人船避坑指南:云卓H12Pro遥控器接海康摄像头,从网络设置到RTSP流延迟优化全流程

本文详细解析了测绘无人船视频子系统的优化方案,重点介绍海康威视摄像头与云卓H12Pro遥控器的深度适配流程。从网络设置到RTSP流延迟优化,提供了一套经过实测的低延迟(<200ms)解决方案,适用于复杂水域环境下的测绘任务。

weixin_30415113的博客 622

图文实录|大规模预训练模型:探讨与展望

第二期「澜舟分享会」我们邀请到来自复旦大学计算机学院邱锡鹏教授分享了“大规模预训练模型:探讨与展望”,本此演讲主要围绕大规模预训练语言模型展开讨论,并探讨大模型成功的原因、适用场景、未来发展方向以及身处大模型时代我们的机遇。

langboat_mengzi的博客 1204

十大排序算法之快速排序C++实现及详细注释

快速排序 算法讲解: 采用hoare版本(左右指针法) 思路: 1.选出一个key,一般是最左边或是最右边的。 2.定义一个begin和一个end,begin从左向右走,end从右向左走。(需要注意的是:若选择最左边的数据作为key,则需要end先走;若选择最右边的数据作为key,则需要begin先走)。 3.(选取最左边的值作为key)在走的过程中,若end遇到小于key的数,则停下,begin开始走,直到begin遇到一个大于key的数时,将begin和right的内容交换,end再次开始走,如此进

发如雪 1649

MuJoCo 相机图片怎么拿?视角调整获取物体图片及实时显示(附代码)

在Mujoco的仿真中,对于识别抓取场景来说,如何获得添加的body等物体的实时图像很重要,今天就分享下如何添加相机视角及可视化小方块(举例)的实时图片。复制一个scene.xml为scene_withcamera.xml,在xml中添加camera和小方块如下。设置xml文件中添加的相机body id。需要创建一个离屏渲染器。

darcsdn 2128

c++ 快速排序

像整理书架——选一本书作为参考,把比它矮的书放左边,高的放右边,再对左右两堆书分别重复操作。如果需要进一步优化(如随机化基准或三数取中法),可以告诉我!:如果输入数组已有序,传统快速排序效率极低!快速排序(Quick Sort)是一种。的方式讲解快速排序,结合。:随机化基准(见优化部分)。,帮助你彻底理解它。

weixin_59748337的博客 1524

舵机操作手册

微型伺服马达原理与控制(中鸣) 1、微型伺服马达内部结构一个微型伺服马达内部包括了一个小型直流马达;一组变速齿轮组;一个反馈可调电位器;及一块电子控制板。其中,高速转动的直流马达提供了原始动力,带动变速(减速)齿轮组,使之产生高扭力的输出,齿轮组的变速比愈大,伺服马达的输出扭力也愈大,也就是说越能承受更大的重量,但转动的速度也愈低。 2、微行伺服马达的工作原理一个微型伺服马达是一个典型闭环反馈系统,其原理可由下图表示: 减速齿轮组由马达驱动,其终端(输出端)带动一个线性的比例电位器作位置检测,该电位器把

HEIMENGER的博客 3133

产品经理必备知识——API接口

在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如果你选择允许,app就会根据你的当前位置为你提供更加个性化的一些服务,当然也有一些app拿到你的位置信息做出损害用户利益的行为,所以还是需要谨慎授权。首先,看接口文档的场景一般是自身业务模块需要获取外部的数据,但又不想自己重新开发,寻找外部已经实现的有开放能力的供应商(包含企业内部的)。通过发送请求和响应消息的方式实现程序间的通信。

WBKJ_Noah_的博客 3454

改进版快速排序算法详解及实现(内附完整代码及注释)

本文介绍了快速排序算法的C++实现,重点讲解了其分治思想和三数取中优化方法。文章阐述了算法的核心流程:选取基准值、左右双指针遍历、分区交换和递归处理。针对不同场景给出了使用建议,指出在嵌入式系统需考虑内存限制(推荐SRAM≥32KB)。提供了完整代码实现,包含三数取中函数、递归排序逻辑和正/逆序支持,并建议小数据量时可简化基准值选取以提高效率。最后通过测试案例验证了算法正确性。

人生的意义在于新的经历 650

华为OD机试真题 新系统 2026-07-22 Java&Go&C 实现【最小代价完成论文评审】

某校有 n 篇论文需要分配给教师评审。 每篇论文 i 可由 files[i] 对应的教师列表中任一教师评审。 每篇论文至少需要一名教师评审。 每位教师 t 不论被分配多少篇论文,其评审费用固定为 cost[t]。 请给出参与评审教师数量最少时的总费用。 如果存在多种方案满足教师数量最少,则选择总费用最小的方案。

MISAYAONE的博客 147

C++快速排序之整型数组

最近遇到oj上关于排序的题目。选择排序,冒泡排序以及冒泡排序优化都无法accepted,后来知道了sort()函数(头文件是#include)或者手写快速排序可以解决。

IT OR 考公? 1949

推理引擎终极对决:TensorRT vs ONNX Runtime,YOLOv8速度差30%的核心原因与实操指南

若你使用NVIDIA GPU,且追求极致速度和低延迟,TensorRT是唯一选择,尤其是边缘设备和实时场景;若你需要跨硬件部署、快速验证原型,或预算有限(无需NVIDIA GPU),ONNX Runtime是性价比之王;对于YOLOv8这类检测模型,TensorRT的FP16/INT8量化是“免费的速度提升”,建议优先采用。最后提醒:推理引擎的优化是“细节决定成败”——同样的引擎,不同的预处理方式、显存配置、批大小,都会导致10%-20%的性能差异。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1026

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++ 快速排序、去重

C++ 快速排序、去重 快速排序的C++代码及详细注释如下 欢迎交流 运用分治的思想 将问题分为多个子问题 运用递归的方法 细节见注释 #include<iostream> using namespace std; //交换函数 template<typename T> void swa(T&a,T&b) { T temp=a; a=b; b=temp; return; } //快排 分治思想 template<typename T> void

weixin_46566957的博客 1217

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c++快速排序算法

c++快速排序算法 题目描述 利用快速排序算法将读入的NN个数从小到大排序后输出。 快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++选手请不要试图使用STL,虽然你可以使用sort一遍过,但是你并没有掌握快速排序算法的精髓。) 输入输出格式 输入格式: 第11行为一个正整数NN,第22行包含NN个空格隔开的正整数a_iai,为你需要...

weixin_30727835的博客 481

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

c/c++实现快速排序

快速排序算法实现,代码注释即为算法说明 #include <iostream> using namespace std; //自定义实现交换算法 void _swap_(int& x, int& y) { int tmp = x; x = y; y = tmp; } /* 以datas[left]为基准找的位置r,并进行初步排序,使得r左边的数据都小于...

yanhaiming56的博客 265

c++实现非递归的快速排序

代码说明 代码是我亲自码的,调试通过的,代码中有算法思想和详细的注释,一目了然。 项目已经上传到我的github:https://github.com/yisun03/sort 递归实现见我的另一篇blog:https://blog.youkuaiyun.com/weixin_39408343/article/details/107086104 项目中近期会陆续更新十种排序算法的c++实现代码以及其思想。 术语说明 1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b ..

Yi Sun的博客 1860

C++文件注释规范详解

本文档详细介绍了C++文件注释的常见规范,涵盖文件头部注释、函数注释、代码块与行内注释、命名空间与类注释等方面,同时阐述了其他相关规范及完整示例,旨在为C++开发者提供清晰、实用的注释指导,便于代码维护与团队协作,提升代码质量和可读性

青蛙博客 1741

【算法】基于hoare快速排序的三种思想和非递归,基准值选取优化【快速排序的深度剖析-超级详细的注释和解释】你真的完全学会快速排序了吗?

【快速排序】深度剖析,跟着博主深度理解快速排序的精髓和思想!干货满满不要错过哦!

系统编程、网络编程 947
上一篇: C++归并排序(注释超详细)
下一篇: C++堆排序的实现(超详细)
Spade_
博客等级 码龄10年 918粉丝 123原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值