方法一
以左端点为基准
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int a[N];
void quicksort(int a[], int l, int r){
if(l >= r) return ;
int i = l, j = r, x = a[l];
while(i < j){
while(i < j && a[j] >= x) j--;
while(i < j && a[i] <= x) i++;
swap(a[i], a[j]);
}
swap(a[i], a[l]);
quicksort(a, l, i-1);
quicksort(a, i+1, r);
}
int main(){
int n;
cin>>n;
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
quicksort(a, 0, n-1);
for(int i = 0; i < n; i++) cout<<a[i]<<" ";
return 0;
}
注意:当N = 100000 并且数组有序时超时
方法二
以数组中间数据为基准
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int a[N];
void quick_sort(int a[], int l, int r){
if(l >= r) return ;
int i = l-1, j = r+1, x = a[l + r >> 1];
while(i < j){
do i++; while(a[i] < x);
do j--; while(a[j] > x);
if(i < j) swap(a[i], a[j]);
}
quick_sort(a, l, j);
quick_sort(a, j+1, r);
}
int main(){
int n;
cin>>n;
for(int i = 0; i < n; i++) cin>>a[i];
quick_sort(a, 0, n-1);
for(int i = 0; i < n; i++) cout<<a[i]<<" ";
cout<<endl;
return 0;
}