递归实现:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int partition_(vector<int>& v, int left, int right) {
int st = left;
int ed = right;
int key = v[st];
while(st < ed) {
while(st < ed && v[ed] > key) {
ed--;
}
if (st < ed) v[st++] = v[ed];
while(st < ed && v[st] < key) {
st++;
}
if (st < ed) v[ed--] = v[st];
}
v[st] = key;
return st;
}
void quickSort(vector<int>& v, int left, int right) {
if (left < right) {
int p = partition_(v, left, right);
quickSort(v, left, p-1);
quickSort(v, p+1, right);
}
}
int main() {
int n;
while(cin >> n) {
vector<int> nums;
for (int i=0; i<n; ++i) {
int tmp;
cin >> tmp;
nums.push_back(tmp);
}
quickSort(nums, 0, n-1);
for (int i=0; i<n; ++i) {
cout << nums[i] << " ";
}
cout << endl;
}
return 0;
}
非递归实现:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
int partition_(vector<int>& v, int left, int right) {
int st = left;
int ed = right;
int key = v[st];
while(st < ed) {
while(st < ed && v[ed] > key) {
ed--;
}
if (st < ed) v[st++] = v[ed];
while(st < ed && v[st] < key) {
st++;
}
if (st < ed) v[ed--] = v[st];
}
v[st] = key;
return st;
}
void quickSort(vector<int>& v, int left, int right) {
if (left >= right) return;
stack<pair<int, int> > s;
s.push({left, right});
while(!s.empty()) {
left = s.top().first;
right = s.top().second;
s.pop();
if (left < right) {
int p = partition_(v, left, right);
s.push({left, p-1});
s.push({p+1, right});
}
}
}
int main() {
int n;
while(cin >> n) {
vector<int> nums;
for (int i=0; i<n; ++i) {
int tmp;
cin >> tmp;
nums.push_back(tmp);
}
quickSort(nums, 0, n-1);
for (int i=0; i<n; ++i) {
cout << nums[i] << " ";
}
cout << endl;
}
return 0;
}