1、算法思想
问题描述:从数组array中找出第i小的元素(要求array中没有重复元素的情况),这是个经典的“线性时间选择(Selection in expected linear time)”问题。
思路:算法导论215页9.2 Selection in expect linear time
2、java实现
思路:算法导论216页伪代码
/*期望为线性时间的选择算法,输入要求,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
时间: 2024-10-05 18:22:15