1 int partition(int* A, int p, int r) { 2 swap(A[p], A[(p + r) / 2]); 3 const int key = A[p]; 4 5 int last = p; 6 for (int k = p + 1;k < r;k++) 7 if (key > A[k])swap(A[++last], A[k]); 8 9 swap(A[last], A[p]); 10 return last; 11 } 12 13 int qselect(int* A, int p, int r, int i) {//寻找第i小的元素 14 if (r - p == 1)return A[p];//only one left 15 int q = partition(A, p, r); 16 17 int k = q - p + 1; 18 if ( k== i)return A[q]; 19 if (k > i)return qselect(A, p, q, i); 20 return qselect(A, q + 1, r, i - k); 21 }
qselect模拟快排查找某个顺序统计量(下面简称为key),事实上可以说是找出前i个较小的数。最后一次调用partition把小于key(假设元素互异)的元素都放到了key前面,不过是无序的,算法复杂度的期望是O(n)。