【笔记】
在平均情况下,任何顺序统计(特别是中位数),都可以在线性时间内得到。
int partition(int A[],int p,int r) {
int x = A[r];
int i = p-1;
for (int j=p;j<r;j++) {
if (A[j] <= x) {
i++;
swap(A[i],A[j]);
}
}
swap(A[i+1],A[r]);
return i+1;
}
int randomizedPartition(int A[],int p,int r) {
int i = rand() % (r-p+1) + p;
swap(A[r],A[i]);
return partition(A,p,r);
}
int randomizedSelect(int A[],int p,int r,int i) {
if (p==r) return A[p];
int q = randomizedPartition(A,p,r);
int k = q-p+1;
if (i==k) return A[q];
else if (i<k) return randomizedSelect(A,p,q-1,i);
else return randomizedSelect(A,q+1,r,i-k);
}
【习题】
9.2-1 证明:在RANDOMIZED-SELECT中,对长度为0的数组,不会进行递归调用。
情景1:当r