注意事项:
如果每次取区间起点或者终点作为分界点 x,则会超时。
分界点换成随机值,或者区间中点即可。
代码:
vector数组版:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
void quick_sort(vector<int> &a, int l, int r) {
if(l >= r) return;
int x = a[l + r >> 1], i = l - 1, j = r + 1; // 这里分界点x取中间值即可,取l会超时
while(i < j) {
do i ++; while(a[i] < x);
do j --; while(a[j] > x);
if(i < j) {
a[i] ^= a[j] ^= a[i] ^= a[j];
}
}
quick_sort(a, l, j);
quick_sort(a, j + 1, r);
}
int main() {
int n;
cin >> n;
vector<int> a(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] << " ";
}
return 0;
}
数组版:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N];
void quick_sort(int a[], int l, int r) {
if(l >= r) return;
int x = a[l + r >> 1], i = l - 1, j = r + 1;
while(i < j) {
do i ++; while(a[i] < x);
do j --; while(a[j] > x);
if(i < j) {
a[i] ^= a[j] ^= 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] << " ";
}
return 0;
}
sort函数版:
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000010];
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n);
for(int i = 0; i < n; i ++) cout << a[i] << " ";
return 0;
}