快速排序

快速排序

规则:从给定数组中选定一个基准数,将该数组中比基准数小的数排在基准数之前,将比基准数大的数排在基准数之后,即确定基准数在有序数列中的最终位置。递归以上过程,直到将数组中的元素全部确定最终位置为止。

  • 空间复杂度:由于快排是递归的,需要借助一个工作栈来保存每次递归调用的必要信息,其容量与递归调用的最大深度一致,为O(log2 n);
  • 时间复杂度:王道书上以每次排序后的第一个数为基准所以快排的运行时间与划分的对称度有关,在基本有序和基本逆序的情况下可达到最坏情况O(n^2);但是,若改进一下算法,每次以mid中间数为基准,则可以使时间复杂度稳定保持在O(log2 n)
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int A[N],n;
void QuickSort(int l,int h)
{
    if(l>=h) return;
    int x=A[(l+h)/2];
    int i=l-1,j=h+1;
    while(i<j){
        do{
            i++;
        }while(A[i]<x);
        do{
            j--;
        }while(A[j]>x);
    if(i<j) swap(A[i],A[j]);
    }
    QuickSort(l,j);
    QuickSort(j+1,h);
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&A[i]);
    QuickSort(0,n-1);
    for(int j=0;j<n;j++)
        printf("%d ",A[j]);

    return 0;
}
/*
5
1 3 2 4 5
*/

为成功学会快排干杯

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值