#include <vector>
#include <iostream>
#include <stdlib.h>
template <typename Comparable>
const Comparable & median3(std::vector<Comparable> &a, int left, int right) {
int center = (left + right) / 2;
if (a[left] > a[center])
std::swap(a[left], a[center]);
if (a[center] > a[right])
std::swap(a[center], a[right]);
if (a[left] > a[center])
std::swap(a[left], a[center]);
std::swap(a[center], a[right-1]);
return a[right-1];
}
template <typename Comparable>
void mergesort (std::vector<Comparable> &a, int left, int right) {
for (int i = left; i < right; ++i) {
for (int j = i + 1; j > left; --j) {
if (a[j] < a[j-1]) {
std::swap(a[j], a[j-1]);
}
}
}
}
template <typename Comparable>
void _quicksort (std::vector<Comparable> &a, int left, int right) {
if (left + 10 <= right) {
const Comparable &pivot = median3(a, left, right);
int i = left, j = right - 1;
for ( ; ; ) {
while(a[++i] < pivot) ;
while(a[--j] > pivot) ;
if (i < j)
std::swap(a[i], a[j]);
else
break;
}
std::swap(a[i], a[right-1]);
_quicksort(a, left, i - 1);
_quicksort(a, i + 1, right);
} else {
mergesort(a, left, right);
}
}
template <typename Comparable>
void quicksort (std::vector<Comparable> &a) {
_quicksort(a, 0, a.size() - 1);
}
template <typename Comparable>
void print(std::vector<Comparable> &a) {
for (auto &i : a) {
std::cout << i << " ";
}
std::cout << std::endl;
}
int main(){
std::vector<int> a;
for (int i = 0; i < 10; ++i) {
a.push_back(rand() % 100);
}
std::cout << "before sort" << std::endl;
print(a);
quicksort(a);
std::cout << "after sort" << std::endl;
print(a);
return 0;
}
其中需要注意的代码片段
while(a[++i] < pivot) ;
while(a[--j] > pivot) ; // 不能 while(a[j] > pivot) { --j} 这样没办法跳过与pivot相等的下标可能死循环
if (i < j)
std::swap(a[i], a[j]);
else
break;