diff --git a/quick_select.hh b/quick_select.hh index 31ae9b0..d0a3929 100644 --- a/quick_select.hh +++ b/quick_select.hh @@ -18,11 +18,21 @@ static inline void swap(TYPE *a, int i, int j) a[j] = t; } +template +static inline void sort(TYPE *a, int i, int j, int k) +{ + if (a[i] > a[j]) + swap(a, i, j); + if (a[i] > a[k]) + swap(a, i, k); + if (a[j] > a[k]) + swap(a, j, k); +} + template static int partition(TYPE *a, int l, int h) { - int p = (l + h) / 2; - swap(a, p, h); + sort(a, (l + h) / 2, h, l); for (int i = l; i < h; ++i) if (a[i] < a[h]) swap(a, i, l++);