快速排序:
#include<iostream>
#include<stdlib.h>//
#include<time.h>//这两个都是调用随机数的函数;
using namespace std;
int n;
const int maxn=100010;
int a[maxn];
int partition(int a[],int left,int right){//快排划分区间;
int num=rand()%(right-left+1)+left;//随机数的下标,产生一个[left,right]的随机数,这样做的目的是防止因有序数列导致时间复杂度变成n^2,利用随机数可以尽可能的划分长度相等的区间;
int temp=a[num];
swap(a[left],a[num]);///a[num]已经用temp取出来了,把最左的位置空出来;
while(left<right){
while(left<right&&temp<a[right])right--;//left有空位,所以从右边开始遍历,如果没有left<right这句话,如果temp右边的数都是小于temp的,那么左指针就会一直移动直到数组越界;
a[left]=a[right];
while(left<right&&temp>=a[left])left++;
a[right]=a[left];
}
a[left]=temp;
return left;
}
void quicksort(int a[],int left,int right){
if(left<right){//划分区间,直至每个区间的单位长度为1;
int pos=partition(a,left,right);//不断确定基准值的位置,因为当每个区间的单位为1的时候就是每个基准值的位置确定是时候,从而满足排序;
quicksort(a,left,pos-1);
quicksort(a,pos+1,right);
}
}
int main(){
srand((unsigned)time(NULL));//产生随机数的种子,srand(初始化随机种子);
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
quicksort(a,0,n-1);
for(int i=0;i<n;i++)cout<<a[i];
return 0;
}