1.概述
快速排序,听这个名字就能想到它排序速度比较快方法,是一种分治思想,现在各种语言中自带的排序库很多使用的都是快速排序。
空间复杂度
快速排序是一种原地排序,只需要一个很小的栈作为辅助空间,空间复杂度为O(log2n),所以适合在数据集比较大的时候使用。
时间复杂度
时间复杂度比较复杂,最好的情况是O(n),最差的情况是O(n2),所以平时说的O(nlogn),为其平均时间复杂度。
2.基本思想
- 从要排序的数据中取一个数为“基准数”。
- 通过一趟排序将要排序的数据分割成独立的两部分,其中左边的数据都比“基准数”小,右边的数据都比“基准数”大。
- 然后再按步骤2对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
该思想可以概括为:挖坑填数 + 分治法
3.代码
#include<bits/stdc++.h>
using namespace std;
int a[50005],n;
void qiukSort(int start,int end)
{
if(start>=end)return;
int index=a[start];//取最左边的为基数
int i=start;
int j=end;
while(i<j)//当i=j跳出循环
{ while(j>i&&a[j]>=index)//从右向左找到第一个比index大的数
{
j--;
}
a[i]=a[j];
while(i<j&&a[i]<=index)//从左向右找到第一个比index小的数
{
i++;
}
a[j]=a[i]; }
a[i]=index;//将基数填入最后的坑
qiukSort(start,i-1);
qiukSort(i+1,end);}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
qiukSort(0,n-1);
for(int k=0;k<n;k++)
{
cout<<a[k]<<' ';
}
cout<<endl;
}