/*期望为线性时间的选择算法,输入要求,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)
原文:http://blog.csdn.net/brillianteagle/article/details/38641811