论坛首页 Java企业应用论坛

一道腾讯面试题

浏览 39249 次
精华帖 (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;
	}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics