1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#include <iostream> #include <vector> using namespace std; #define MAX_LENGTH 10
template <typename Compareble> Compareble medianPivot(std::vector<Compareble>& a,int left,int right) { int center = (left + right) / 2; if(a[center] < a [left]) swap(a[left], a[center]); if(a[right] < a [left]) swap(a[left], a[right]); if(a[right] < a [center]) swap(a[center], a[right]);
swap(a[center], a[right - 1]); return a[right - 1]; #rand swap(i, right) return a[right] }
template <typename Compareble> int mediansort(std::vector<Compareble>& items,int left,int right) { if(right - left + 1 > MAX_LENGTH) {
int i = left;#rand left-1 int j = right -1;#rand right const Compareble & pivot = medianPivot(items, left, right);
while(true) { while (items[++i] < pivot) {} while (items[--j] > pivot) {} if (i < j) swap(items[i], items[j]); else break; } swap(items[i], items[right - 1]);#rand i,right
mediansort(items, left, i - 1);#rand left,i-1 mediansort(items, i + 1, right);#rand i+1 right } else insertSort(items, left, right); }
template <typename Compareble> void medianSort(std::vector<Compareble>& items) { mediansort(items, 0, items.size() - 1); }
|