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
| void quick_sort(int q[], int l, int r) { if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j), quick_sort(q, j + 1, r); }
下面这道题目是基于快排思想的TopK,他们的partion逻辑不太一样,其中一个很重要的点在于: quickselect要求把输入分成了三部分,[<=X] X [>X]; 而上面的quicksort只是把输入分成了两部分,[<X],[>=X]或者[<=X], [>X] 分割点在某一区间内,但是不一定在区间的两端;
```cpp class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { qselect(input, 0, input.size() - 1, k); vector<int> res(k); for (int i = 0; i < k; ++i) { res[i] = input[i]; } return res; }
void qselect(vector<int>& q, int l, int r, int k) { if (l >= r) return; int i = l, j = r, x = q[l]; while (i < j) { while(i < j && q[j] > x) j--; q[i] = q[j]; while (i < j && q[i] < x) i++; q[j] = q[i] } a[i] = x;
if (i - l + 1 == k ) return; else if (i - l + 1 < k) qselect(q, j + 1, r, k - (i - l + 1)); else qselect(q, l, j - 1, k); } };
|