快速排序[原理,C++实现,注意事项,时间复杂度分析]

模板:

cpp 复制代码
//本模板来自ACwing
void quick_sort(int q[],int l,int r)
{
    if(l>=r) return;
    
    int x=q[l+r>>1],i=l-1,j=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);
};

原理:

注意事项:

(1)为什么while的循环控制条件一定不带等号?

如果写成:

cpp 复制代码
do i++;while(q[i]<=x);

那么如果x恰好是待排序数组中最大的元素,那么while条件会一直成立,那么i将会一直走到头,j也是同理,如果选中的x恰好是数组中最小的元素,那么j一直走到头。

所以,while的循环控制条件不带等号

(2)为什么是do-while,不能用while

如果写成:

cpp 复制代码
while(q[i]<x) i++;
while(q[j]>x) j--;

设想这种情况,

2............2............2

x=2,i和j分别指向左右两边的2,那么两个while条件上来就不成立,i和j会无法移动,陷入死循环

(3)为什么交换qi和qj之前要判断i<j

最终,i和j指针无非两种情况,

1.相遇,相等

2.穿过,错一

设想案例:2,1,x=2,

将1和2交换后,进入下一轮循环,因为是do-while,所以i和j又将各自前移一位,最终会形成此种情形

如果swap前不检查i<j,那么此时又会swap,那么最终退出循环后,数组相当于没被排序,还是原样,

swap前判断i<j,为防i j交叉

(4)递归区间和x的关系,

如果x==qi+j\>\>1,那么递归区间写quick_sort(q,l,j), quick_sort(q,j+1,r)

如果x==qi+j+1\>\>1,那么递归区间写quick_sort(q,l,i-1),quick_sort(q,i,r)

为何不写quick_sort(q,l,j-1), quick_sort(q,j,r)?或者quick_sort(q,l,i),quick_sort(q,i+1,r)?

因为满足<=x的,是 l,i-1,l,j 区间,满足>=x的,是 i,r,j+1,r 区间

因为x=qi+j\>\>1,可能会导致i=l,比如案例:1,2 ,此时如果递归区间写此时i=l,那么会发生l,r调用l,r,也即死递归

x=qi+j+1\>\>1,可能会导致j=r,同样可举案例:1,2,同理。

总结:

快排算法写错,一般只可能有两种情况:

1.死循环

这里的循环陷入死路,对应注意事项(2)

2.死递归

quick_sort(a,m,n)

quick_sort(a,m,i-1)

quick_sort(a,i,n)

若i等于m ,出现死递归

quick_sort(a,m,n)

quick_sort(a,m,j)

quick_sort(a,j+1,n)

而j=n,出现死递归

对应注意事项(4)

时间复杂度分析:

相关推荐
怪奇云呼军几秒前
闪电智能 Voice Agent 怎样根据语速、停顿和追问方式切换话术?策略引擎拆解
开发语言·人工智能·网络协议·算法·语音识别·web app
努力努力再努力wz2 分钟前
【分布式系统与 RPC 框架系列】从单机瓶颈到远程调用:一文理解分布式架构与 RPC 原理
linux·网络·c++·分布式·网络协议·rpc·架构
稚南城才子,乌衣巷风流4 分钟前
树链剖分(树剖)算法详解:从原理到实现
算法·深度优先
jz_ddk15 分钟前
[信号处理] 数学与工程之美:相邻差分共轭乘积
数学·算法·信号处理·差分·共轭
神仙别闹19 分钟前
基于C++实现(控制台)景区旅游管理系统
开发语言·c++·旅游
m沐沐9 小时前
【深度学习】YOLOv2目标检测算法——改进点、网络结构与聚类先验框解析
人工智能·pytorch·深度学习·算法·yolo·目标检测·transformer
不会就选b9 小时前
算法日常・每日刷题--<链表>3
数据结构·算法·链表
geovindu9 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
Zachery Pole11 小时前
CCF-CSP备战NO.7【队列】
算法
闪电悠米11 小时前
力扣hot100-48.旋转图像-转置翻转详解
算法·leetcode·职场和发展