排序算法之快速排序

快速排序是一种基于分治策略的排序算法,平均时间复杂度为O(n*log(n))。通过选取基数并调整序列,使得比基数小的值在其左侧,大的值在其右侧,然后递归地对分割后的序列进行操作,直到序列长度为1。文章讨论了两种处理基数相同情况的方法,一种忽略相同值,另一种不忽略,指出后者效率稍低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序是典型的采用分治法进行排序的算法,即将一个长序列分割成短序列进行排序。快排的平均时间复杂度是O(n*log(n))。
快排的核心思想就是每次递归将一个基数放在它在整个序列排列的正确位置,即比它小的值都在他的左边,比它大的值都在他的右边。为了实现这一点,我们需要两个指针spoint和epoint,分别指向序列的起点和终点。spoint从起点向中间遍历,找到比基数大的数(升序排列如此),epoint从终点向中间遍历,找到比基数小的数(升序排列如此),找到之后将两个数交换,从而使较小的数在左边,较大的数在右边,直到spoint和epoint指向同一个数。之后以基数所在位置为基准,将整个序列分割成两个序列,递归执行两个序列。递归终止的条件是当序列长度为1。
每次递归都要进行循环,那么在循环的开始我们便遇到一个问题,spoint所指向的第一个值即基准值究竟是否参与循环内的交换,还是在循环结束时与epoint指向的值进行交换。两种思路均能实现,下面是代码。
第一种:忽略相同的值

template<typename T>
void swap(T &x, T &y){
    T temp = y;
    y = x;
    x = temp;
    count ++;
}
template <typename T>
void quickSort(T arr[], int start, int end){
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值