递归:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
int data[maxn];
void quick_sort(int l, int r)
{
int i = l, j = r, t = data[l];
if(l >= r) return ;
while(i < j)
{
while(i < j && data[j] >= t) j--;
while(i < j && data[i] <= t) i++; //这里一定是等于
swap(data[i], data[j]);
}
swap(data[i], data[l]);
quick_sort(l, i - 1);
quick_sort(i + 1, r);
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &data[i]);
}
quick_sort(0, n - 1);
for(int i = 0; i < n; i++)
printf("%d%c", data[i], i == n - 1 ? '\n' : ' ');
}
递归2:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
int data[maxn];
void quick_sort(int l, int r)
{
int i = l, j = r, t = data[l];
if(l >= r) return ;
while(i < j)
{
while(i < j && data[j] >= t) j--;
data[i] = data[j];
while(i < j && data[i] <= t) i++;
data[j] = data[i];
}
data[i] = t;
quick_sort(l, i - 1);
quick_sort(i + 1, r);
}
int main()
{
int n;
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++)
{
scanf("%d", &data[i]);
}
quick_sort(0, n - 1);
for(int i = 0; i < n; i++)
printf("%d%c", data[i], i == n - 1 ? '\n' : ' ');
}
}
非递归实现:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
int data[maxn];
int cnt = 0;
void quick_sort(int l, int r) {
stack<int> s;
s.push(l);
s.push(r);
while(!s.empty()) {
int r = s.top(); s.pop();
int l = s.top(); s.pop();
if(l >= r) continue;
int t = data[l];
int i = l, j = r;
while(i < j) {
while(i < j && data[j] >= t) j--;
while(i < j && data[i] <= t) i++;
swap(data[i], data[j]);
}
swap(data[i], data[l]);
s.push(i + 1);
s.push(r);
s.push(l);
s.push(i - 1);
}
}
int main()
{
int n;
for(int i = 0; i < n; i++) {
cin >> data[i];
}
quick_sort(0, n - 1);
for(int i = 0; i < n; i++)
printf("%d%c", data[i], i == n - 1 ? '\n' : ' ');
}
用平均数最为基准:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
const int INF = 0x3f3f3f3f;
int data[maxn];
void quick_sort(int l, int r, int Min, int Max)
{
int i = l, j = r;
if(l >= r) return ;
int t = (Min + Max) / 2;
if(Min == Max) return ;
int temp, tMin = INF, tMax = -INF;
while(i < j && data[j] > t) {
tMin = min(tMin, data[j]);
j--;
}
temp = data[j];
while(i < j)
{
while(i < j && data[i] <= t) {
tMax = max(tMax, data[i]);
i++;
}
data[j] = data[i];
while(i < j && data[j] > t) {
tMin = min(tMin, data[j]);
j--;
}
data[i] = data[j];
}
data[i] = temp;
quick_sort(l, i, Min, tMax);
quick_sort(i + 1, r, tMin, Max);
}
int main()
{
int n;
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++)
{
scanf("%d", &data[i]);
}
int Min = INF, Max = -INF;
for(int i = 0; i < n; i++) {
Min = min(Min, data[i]);
Max = max(Max, data[i]);
}
quick_sort(0, n - 1, Min, Max);
for(int i = 0; i < n; i++)
printf("%d%c", data[i], i == n - 1 ? '\n' : ' ');
}
}
关于STL里面的sort:
STL的sort算法,数据量大时采用Quick Sort,分段递归排序。一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负荷,就改用插入排序。如果递归层次过深,还会改用Heap Sort。