快速排序--学习笔记

快速排序,顾名思义,很快。最坏情况下数据复杂度为O(n^2),平均时间复杂度为O(NlogN).

假设我们现在要队序列{6,1,3,4,2,5,8,7,9,0}用快排来排序

首先我们需要一个基准数,我们就把6设为基准数;

接下来,我们定义i,j两个变量,让j从0开始向左走,让i从6开始向右走(注意一定是j先走),当i指向的数大于基准数,j指向的数小于基准数时,就交换i,j指向的数。或者当i,j相遇时,就把相遇时的数和基准数交换

比如第一次交换之后,序列就变成了{6,1,3,4,2,5,0,7,9,8}

这时左边的序列为{6,1,3,4,2,5,0},右边序列为{7,9,8};

对于左边的序列,我们就让基准数为3,然后重复上面操作

对于右边,我们就让基准数为7,然后重复上面操作。

直到所有的数全部归位。

为什么一定是j先走?

假如有以下序列{6,1,2,3,4,7,9}

如果让i先走,j后走,那么第一次交换之后的序列为{7,1,2,3,4,6,9}

这与我们想达到的序列{1,2,3,4,6,7,9}的初衷是不是背离了

快排为什么快?

因为快排是跳跃式交换,快排每次排序都会设立基准点,将大于基准点的数放在右边,将小于基准点的数放在左边。交换的距离变大了,交换的次数自然就变少了,速度就变快了。

题目

题目描述

利用快速排序算法将读入的 NN 个数从小到大排序后输出。

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)

输入格式

第 11 行为一个正整数 NN,第 22 行包含 NN 个空格隔开的正整数 a_iai​,为你需要进行排序的数,数据保证了 A_iAi​ 不超过 10^9109。

输出格式

将给定的 NN 个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入输出样例

输入 #1复制

5
4 2 4 5 1

输出 #1复制

1 2 4 4 5

代码展示 

#include<stdio.h>
int n,a[100000];
void sort(int l,int len)
{
    int i,j,mid,t;
    i=l,j=len;
    mid=a[(i+j)/2];//基准数
    while(i<=j)
    {
        while(a[i]<mid)
            i++;//左边小于基准数
        while(a[j]>mid)
            j--;//右边大于基准数
        if(i<=j)//不满足时,就交换
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
            i++;
            j--;
        }
    }
    if(l<j)
        sort(l,j);
    if(i<len)
        sort(i,len);
}
int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    sort(1,n);//快排
    for(int i=1; i<=n; i++)
        printf("%d ",a[i]);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值