快速排序--学习笔记

快速排序--学习笔记,第1张

快速排序--学习笔记

快速排序,顾名思义,很快。最坏情况下数据复杂度为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
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)
            j--;//右边大于基准数
        if(i<=j)//不满足时,就交换
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
            i++;
            j--;
        }
    }
    if(l 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713382.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存