[深入浅出学算法][排序专题] 快速排序
之前给大家讲过快排了,今天再讲一遍……
题目描述
排序大师今天在课上给徒弟们教快速排序O(n*log_n),总结分三步走
- 在序列中取一个数(这里我们取序列最后的一个元素值)
- 将序列分成三组①比a小的部分 ②元素a ③比a大的部分
- 递归1和2两个步骤,直到序列中的元素个数为1
原序列以2为分隔数,第一趟排序结束,分为三组序列:① 1 ② 2 ③ 4 5 3 ;序列①发现元素个数为1,
结束;序列②元素个数为1,结束;序列③发现元素个数>1,选择3为分隔数,
分为三组序列:① 空 ② 3 ③ 5 4;序列①空,结束,序列②元素个数为1,
结束;序列③元素个数=2>1,选择4为分隔数,分为三组序列:① 空 ② 4 ③ 5 排序完成
对于区间[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;
}