[深入浅出学算法][排序专题] 快速排序

[深入浅出学算法][排序专题] 快速排序

之前给大家讲过快排了,今天再讲一遍……

题目描述

排序大师今天在课上给徒弟们教快速排序O(n*log_n),总结分三步走

  • 在序列中取一个数(这里我们取序列最后的一个元素值)
  • 将序列分成三组①比a小的部分 ②元素a ③比a大的部分
  • 递归1和2两个步骤,直到序列中的元素个数为1
原序列以2为分隔数,第一趟排序结束,分为三组序列:① 124 5 3 ;序列①发现元素个数为1,
结束;序列②元素个数为1,结束;序列③发现元素个数>1,选择3为分隔数,
分为三组序列:① 空 ② 35 4;序列①空,结束,序列②元素个数为1,
结束;序列③元素个数=2>1,选择4为分隔数,分为三组序列:① 空 ② 45 排序完成


对于区间[l,r]选择分隔数可以随便选,可以选第一个a[l],
也可以选最后一个a[r],也可以选a[(l+r)/2],希望大家动手画出树形图,加深理解

输入

第一行输入一个整数N(1<=N<=100000)
第二行输入N个整数ai(0<=a[i]<=10^9)

输出

从小到大输出N个数,每相邻两个数之间有一个空格

样例输入

5 
5 4 3 2 1

样例输出

1 2 3 4 5

提示

掌握快排的核心思想,一定画一遍递归的过程树

题解:

不理解快排的人可以看快速排序[虽然可以用冒泡 ]

源代码:(我用sort,哈哈

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a[1000010],i;
    cin>>n;
    for(i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    for(i=0;i<n;i++) cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

AC

猜你喜欢

转载自blog.csdn.net/m0_45682806/article/details/107883998