最快效率求出乱序数组中第k小的数:
第k个元素:以尽量高的效率,求出一个乱序数组中按数值顺序的第k个元素值。
//伪代码:
selectK(A,p,r,k){
q=partition(A,p,r); //主元下标
qK=q-p+1; //主元是第几个元素(排好序后)
if(qK==k){
return A[q];
}
else if(qK>k){
return selectK(A,p,q-1,k);
}
else{
return selectK(A,q+1,r,k-qK);
}
}
partition(A,p,r)
代码:
#include<iostream>
using namespace std;
//三点中值法
int partition(int A[],int p,int r){
//优化: 在p、r、mid之间,选一个中间值作为主元
int midIndex=p+((r-p)>>1); //中间下标
int midValueIndex=-1; //中值的下标
if(A[p]<=A[midIndex]&&A[p]>=A[r]){
midValueIndex=p;
}
else if(A[r]<=A[midIndex]&&A[r]>=A[p]){
midValueIndex=r;
}
else{
midValueIndex=midIndex;
}
swap(A[p],A[midValueIndex]);
int pivot=A[p];
int left=p+1;//扫描指针
int right=r; //右侧指针
while(left<=right){
//left不停往右走,直到遇到大于主元的元素
while(A[left]<=pivot)