系列文章目录
建设中…
前言
快速排序是所有排序算法中时间复杂度最低的算法,是排序算法学习无法绕开的一环,也是学习分治法的很好的例子。
提示:在学习快排之前需要熟练掌握递归
一、快速排序原理简介
快速排序是基于分治思想的一种排序算法,请你想象一下,在你玩弄俄罗斯套娃时,首先你将这组套娃以“比一个特定的套娃大”与“比一个特定的套娃小”的规则分为两组,而分出的两组依然以上述规则分为两组,直到最后无法分组时,俄罗斯套娃也就分配好了。
而这也就是快排的核心思想——分而治之。
二、算法解析
1.时间复杂度分析
o(nlog(n))
证明过程:建设中。
2.代码实现
#include <bits/stdc++.h>
using namespace std;
int n;
long long a[100001];
void mysort(int ,int );
int main(){
scanf ("%d",&n);
for (int i=1;i<=n;i++) scanf ("%lld",&a[i]);
mysort (1,n);
for(int i=1;i<=n-1;i++) printf ("%lld ",a[i]);
printf ("%lld\n",a[n]);
return 0;
}
void mysort(int l,int r){
int z,key,i=l,j=r;
key=a[(l+r)/2];
while (i<=j){//对于每个分组完全一致的处理。
while (a[i]<key) i++;
while (a[j]>key) j--;
if (i<=j){
swap(a[i],a[j]);
i++;
j--;
}
}
if (l<j)mysort (l,j);//分治
if (r>i)mysort (i,r);
}
总结
快排只是看起来比较吓人,实际上等你理解后,会发现快排并不比希尔排序,基数排序难上多少。