#include<stdio.h>
int nums[2000000];
void swap(int a,int b){
int t=nums[a];
nums[a]=nums[b];
nums[b]=t;
}
int medianThree(int l,int m,int r){
if((nums[l]<nums[m])^(nums[l]<nums[r])){
return l;
}
else if((nums[m]<nums[l])^(nums[m]<nums[r])){
return m;
}
else
return r;
}
int partiton(int l,int r){
swap(l,medianThree(l,(l+r)/2,r));/*这行就是基准数选取为左中右中的中位数*/
int i=l;
while(i<r){
while(i<r&&nums[r]>=nums[l]){
r--;
}
while(i<r&&nums[i]<=nums[l]){
i++;
}
swap(i,r);
}
swap(i,l);
return i;
}
void quick_sort(int l,int r){
if(l>=r){
return;
}
int part=partiton(l,r);
quick_sort(l,part-1);
quick_sort(part+1,r);
}
int a,b;
int main(){
scanf("%d %d",&a,&b);
for(int i=0;i<b;i++){
scanf("%d",nums+i);
}
quick_sort(0,b-1);
for(int i=0;i<b;i++){
printf("%d ",nums[i]);
}
return 0;
}
- 基准数选取优化为了防止快排劣化到O(n2)
- 去掉基准数优化,不会出现TLE,直接AC,反之出现TLE