锁定老帖子 主题:一道腾讯面试题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-25
最后修改:2010-09-25
用分治法吧,算法导论上面就有,时间复杂度是O(n),有详细的证明过程,我用java实现了这个算法
public static int selectMiddle(int[] data) { int mid = data.length / 2 + 1; return selectMiddle(data, 0, data.length - 1, mid); } private static int selectMiddle(int[] data, int first, int last, int i) { if(first == last) return data[first]; int index = partition(data, first, last); int k = index - first + 1; if(i == k) return data[index]; else if(i < k) return selectMiddle(data, first, index - 1, i); else return selectMiddle(data, index + 1, last, i - k); } private static int partition(int[] data, int first, int last) { int index = (first + last) >> 1; int pivot = data[index]; swap(data, index, last); int i = first; int j = last - 1; while(true) { while(i < j && data[i] <= pivot) i++; while(j >= i && data[j] >= pivot) j--; if(j < i) break; swap(data, i++, j--); } swap(data, i, last); return i; } |
|
返回顶楼 | |