标签:算法导论 数组中选择第k小元素 线性时间选择
/*期望为线性时间的选择算法,输入要求,array中没有重复的元素*/
public static int randomizedSelect(int[] array,int start,int end,int i) {
if (start==end) {
return array[start];
}
int middle=randomizedPartition(array, start, end);
int k=middle-start+1;
if (i==k) {
return array[middle];
}else if (i<k) {
return randomizedSelect(array, start, middle-1, i);
}else {
return randomizedSelect(array, middle+1, end, i-k);
}
}
randomizedPartition(array,start,end)参见:【算法导论-010】快速排序(quickSort)
3、非递归版本
/*非递归版本的线性时间选择*/
public static int iterativeRandomizedSelect(int[] array,int start,int end,int i) {
int result=0;
while (start<=end) {
if (start==end) {
return array[start];
}
int middle=randomizedPartition(array, start, end);
int k=middle-start+1;
if (i==k) {
result= array[i];
} else if (i<k) {
end=middle-1;
}else {
start=middle+1;
i=i-k;
}
}
return result;
}
【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time),布布扣,bubuko.com
【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time)
标签:算法导论 数组中选择第k小元素 线性时间选择
原文地址:http://blog.csdn.net/brillianteagle/article/details/38641811