快速排序
规则:从给定数组中选定一个基准数,将该数组中比基准数小的数排在基准数之前,将比基准数大的数排在基准数之后,即确定基准数在有序数列中的最终位置。递归以上过程,直到将数组中的元素全部确定最终位置为止。
- 空间复杂度:由于快排是递归的,需要借助一个工作栈来保存每次递归调用的必要信息,其容量与递归调用的最大深度一致,为O(log2 n);
- 时间复杂度:王道书上以每次排序后的第一个数为基准所以快排的运行时间与划分的对称度有关,在基本有序和基本逆序的情况下可达到最坏情况O(n^2);但是,若改进一下算法,每次以mid中间数为基准,则可以使时间复杂度稳定保持在O(log2 n)
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int A[N],n;
void QuickSort(int l,int h)
{
if(l>=h) return;
int x=A[(l+h)/2];
int i=l-1,j=h+1;
while(i<j){
do{
i++;
}while(A[i]<x);
do{
j--;
}while(A[j]>x);
if(i<j) swap(A[i],A[j]);
}
QuickSort(l,j);
QuickSort(j+1,h);
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&A[i]);
QuickSort(0,n-1);
for(int j=0;j<n;j++)
printf("%d ",A[j]);
return 0;
}
/*
5
1 3 2 4 5
*/
为成功学会快排干杯