顺序统计量

 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)。

posted on 2018-03-17 12:16  只是个回忆录  阅读(172)  评论(0编辑  收藏  举报

导航