虽然平时我们可以直接用STL库里的sort函数来进行快速排序,但对于需要记录排序过程数据的题sort排序还是一筹莫展,而较好实现的选择排序和冒泡排序时间复杂度实在太高,因此我们有必要掌握快速排序的实现。
注:快排是不稳定的,若想有一个稳定的排序方法,可看下一节--归并排序
快排的最差时间复杂度是O(n^2),平均复杂度则是O(nlogn)。
上代码(输入的话第一行个数n,第二行就是一列数了)
#include <iostream> #include <cstdio> using namespace std; int a[10000]; void quicksort(int left,int right){ if(left>right){ return ;//因为我们递归时有减一的操作 } int temp=a[left];//temp里储存基准数 int i=left,j=right; while(i!=j){ while(a[j]>=temp&&i<j)//基准数在左边取的所以从最右边开始 j--; while(a[i]<=temp&&i<j) i++; if(i<j){//当左右哨兵还没有相遇的时候,交换二者的值 int t=a[i]; a[i]=a[j]; a[j]=t; } } //接下来是二者已相遇,将基准值和相遇地的值交换 temp=a[i]; a[i]=a[left]; a[left]=temp; quicksort(left,i-1); quicksort(i+1,right); } int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } quicksort(0,n-1); for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<endl; }