惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
D
Docker
S
SegmentFault 最新的问题
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
GbyAI
GbyAI
L
LangChain Blog
Vercel News
Vercel News
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
T
Threat Research - Cisco Blogs
T
Threatpost
Scott Helme
Scott Helme
T
Tailwind CSS Blog
Latest news
Latest news
Stack Overflow Blog
Stack Overflow Blog
Blog — PlanetScale
Blog — PlanetScale
The Register - Security
The Register - Security
罗磊的独立博客
P
Proofpoint News Feed
腾讯CDC
S
Schneier on Security
雷峰网
雷峰网
A
About on SuperTechFans
T
Tenable Blog
F
Full Disclosure
Cyberwarzone
Cyberwarzone
博客园_首页
有赞技术团队
有赞技术团队
K
Kaspersky official blog

文章列表

5月月考 - faryou的博客 - 日记 faryou的博客-五一回老家 【汇编 - 功能】中断安装中断实现 【汇编&硬件】时钟中断的具体实现 faryou的博客-这些年,我不再看《熊出没》 【汇编&硬件】关机中断的具体实现 【汇编&硬件】网络连接相关中断的具体实现 faryou的博客-年初小记 【汇编&硬件】鼠标控制中断的具体实现 【汇编&硬件】声音输出中断的具体实现 【汇编&硬件】屏幕输出中断的具体实现 【汇编&硬件】磁盘读取中断的具体实现 【汇编&硬件】键盘读取中断的具体实现 【汇编】汇编环境的搭建及Debug的使用教程 【汇编】漫谈:学习汇编后的一些思考 faryou的博客-关于本站即日起实行“一站三体”运营制度 【汇编基础教程】完结篇 写在最后:前言 【汇编基础教程】使用BIOS的中断实现键盘输入及磁盘I/O 【汇编基础教程】中断 【汇编基础教程】端口 【汇编基础教程】标志寄存器 【汇编基础教程】寄存器和内存&一些基本命令的说明 【汇编基础教程】来存一些数据! 【汇编基础教程】段 【汇编基础教程】再谈栈 【汇编基础教程】更灵活的定位内存 【汇编基础教程】来写个“函数” 【汇编基础教程】理解一下[bx]和loop指令 【汇编基础教程】跳一跳! faryou的博客-我的竞赛经历&对人生的一些思考 faryou的博客-关于现在中小学计算机课的一些想法及思考 faryou的博客-2025年度总结 faryou的博客-临平山下十五年 faryou的博客-Windows 10即将停止支持,谈谈自己从小到大用电脑的感受 faryou的博客-谈谈一名10后的怀旧情怀 【汇编基础教程】8086CPU工作原理 【C语言】指针的理解与应用 【算法教程】【C/C++】DP(动态规划):区间DP——程序设计思路与代码实现 【算法教程】【C/C++】BFS(广度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】DFS(深度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】单源最短路径——程序设计思路与代码实现 【算法教程】【C/C++】最小生成树——程序设计思路与代码实现 【算法教程】【C/C++】并查集——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):背包DP——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):简单动规问题——程序设计思路与代码实现 【算法教程】【C/C++】递推——程序设计思路与代码实现 【算法教程】【C/C++】三分算法——程序设计思路与代码实现 【算法教程】【C/C++】二分答案——程序设计思路与代码实现 【算法教程】【C/C++】二分查找——程序设计思路与代码实现 【算法教程】【C/C++】贪心算法——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快速幂——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:进制转换——程序设计思路与代码实现 一文弄懂C++中的自定义函数
【算法教程】【C/C++】基础数学:快排——程序设计思路与代码实现
faryou · 2024-04-20 · via

前言
有时候,我们需要对数组进行排序,而在算法中,由于对效率的追求,选择排序和冒泡排序已经无法满足我们的需求。这时,我们就需要使用效率更高的快排。

程序设计思路
在快速排序中,我们需要两个指针,分别是左指针和右指针,即left和right。他们从数组两端出发,相向而行。之后找到中点,作为基准数,比基准数大的和小的各自到一边(为讲解方便,这里讲升序)。当左右指针相遇时,我们已经将所有的数分为两组。之后,我们再次进行相同操作,直到将所有的数分组不断细化,最后每个数一组。
这样一来,我们不难想到递归。即当主程序结束后,我们对两组数再次调用主程序本身,之后再次调用。
这种方法的时间复杂度是O(n log n)。

代码实现

void qsort(long long a[],long long left,long long right){三个参数分别为数组名、左右端点
    long long i,j,t;//i、j分别存放左右端点
    if(left>=right) return;//特判,用于最后退出程序
    int x=(left+right)/2;//取中点
    swap(a[x],a[left]);//防止重复
    t=a[left];//基准数
    i=left;
    j=right;
    while(i<j){
        while(a[j]>=t && i<j) j--;//j不断向左,直到发现小数
        while(a[i]<=t && i<j) i++;//i不断向右,直到发现大数
        if(i<j) swap(a[i],a[j]);//如果i比j小,交换
        else break;
    }
    swap(a[left],a[i]);//调换回来
    
    //再次调用
    if(left<i) qsort(a,left,i-1);
    if(right>i) qsort(a,j+1,right);
}

sort( , , )函数使用
在C++的STL库中,有一个sort函数,可以省去我们自写快排的烦恼。
sort( , , )函数的第一个参数是数组头地址,第二个参数是数组尾地址。第三个是cmp函数名称。下面是对数组x[ ]进行排序的代码:

int k=sizeof(x)/sizeof(x[0];//获取数组长度
sort(x,x+k,);//在默认升序序情况下,无需编写cmp()函数

当我们需要对数组进行降序排序时,就需要自写cmp函数,像这样:

bool cmp(int a,int b){//int为数组数据类型
    return a>b;
}
int k=sizeof(x)/sizeof(x[0];//获取数组长度
sort(x,x+k,cmp);

sort还可以进行结构体排序,像下面这样:

bool cmp(class a,class b){
    return a.num<b.num;//降序,如需升序请将>改为<;此处对结构体中的元素num进行排序
}

sort函数的时间复杂度为O(n log n)。

结语
快排极大的提高了效率,使得程序运行速度更快,节省了时间。我是faryou,下次见!