-
基本思想:(分治)
- 先从数列中取出一个数作为key值;
- 将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;
- 对左右两个小数列重复第二步,直至各区间只有1个数。
-
平均时间复杂度:O(N*logN)
#include <bits/stdc++.h>
using namespace std;
void sortquick(int l,int r,int a[]){
if(l >= r){//左边下标大于或等于右边下标结束
return;
}
int i = l , j = r;//左右下标赋值
int key = a[l];//左边第一个值定位key值
while(i < j){
//走右边
while(i < j && key <= a[j]){
j--;
}
if(i < j){
a[i] = a[j];
i++;
}
//走左边
while(i < j && key > a[i]){
i++;
}
if(i < j){
a[j] = a[i];
j--;
}
}
a[i] = key;//找到位置后把key放进去
sortquick(l,i-1,a);//左边快排
sortquick(i+1,r,a);//右边快排
return;
}
int main(){
int n;
scanf("%d",&n);
int a[n];
for(int i = 0 ; i < n ; i++){
scanf("%d",&a[i]);
}
sortquick(0,n-1,a);
for(int i = n-1 ; i >= 0 ; i--){//逆序输出
printf("%d ",a[i]);
}
}