算法之求数组中第i大的数

原创 2013年12月03日 09:42:17

算法思想:将数组a[n]按照某一主元素进行划分,使数组左边的元素都小于主元素,数组右边的元素都大于主元素;

假设主元素左边的元素个数为k,此时,判断k是否等于i,如果相等则返回,否则如果k大于i,则在数组左半边搜索

i大的元素,否则在数组右半边搜索第i-k大的元素。


java代码如下:

	/**
	 * 查找数组中第i大的元素。
	 * @param a 数组
	 * @param p 数组下界
	 * @param r 数组上界
	 * @param i 第i大的元素,i>=1
	 * @return 数组中第i大的元素值
	 */
	public static int searchi(int[] a, int p, int r, int i) {

		if (p == r) {

			return a[p];
		}

		int k = partition(a, p, r);
		int q = k - p + 1;
		if (q == i)
			return a[k];

		else if (q > i)
			return searchi(a, p, k - 1, i);
		else
			return searchi(a, k + 1, r, i - q);

	}

	/**
	 * 将数组划分使左边小于主元,右边大于主元,并返回主元索引
	 * @param a	数组
	 * @param p 下界	
	 * @param r 上界
	 * @return	主元索引
	 */
	private static int partition(int[] a, int p, int r) {

		int k = p - 1;

		for (int i = p; i < r; i++) {

			if (a[i] < a[r]) {

				int t = a[k + 1];
				a[k + 1] = a[i];
				a[i] = t;

				k++;

			}

		}

		int t = a[k + 1];
		a[k + 1] = a[r];
		a[r] = t;

		return k + 1;
	}






相关文章推荐

求数组a[N]中第i(1<=i<=n)小的数(2012年某公司实习生招聘面试试题)

当年, 某公司实习生招聘, 在第一轮面试中, 我遇到这样一个题目: 有10000个互不相同的无序整数, 如何找到数组的median值(也就是说: 有一半数比它小, 另一半数比它大)。       ...
  • stpeace
  • stpeace
  • 2015年06月13日 16:21
  • 879

经典算法学习——求数组里面第N大的数

这是一道面试的算法题,当然可以用很多排序算法来实现

算法设计:如何求数组中第i大 或 第i小的数 (续上)

http://blog.csdn.net/yanzi1225627/article/details/8111806 、http://www.eyeandroid.com/thread-9629-1-1...

求一个很大的数组(乱序)排序后从第i大到第j大之间的所有元素,并且这些元素之间要求有序

有时候我们会碰到这样一种情况,有一个很大的乱序数组raw_array[0 -> n -1](百万量级甚至更大),要求这个数组排序后从第i大到第j(j >= i)大个元素,这些元素之间要有序,其中j -...

一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。

一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。 第一个想法就是暴力。时间复杂度O(n^2)。 第二个想法: 利用一个辅助数组,记...
  • imzoer
  • imzoer
  • 2012年10月16日 10:40
  • 1648

一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它

题目:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。           能否只用一个额外数组和少量其它空间实现。 分析:最原...

整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]

给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同, 例如1101是重复数,1231是不重复数。...

整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]

在 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题] 有朋友提到如果输入1111111,效率非常低,确实是这样,诸如这样的还有10998765,,998...

算法导论学习笔记——找数组中第i小的元素

/** * 问题:从一个由n个不同的数组构成的集合中选择其第i个顺序统计量的问题 * 解决:采用类似快速排序的思想即对输入数组进行递归划分,不同之处是,快速排序会递归处理划分的两边, * ...
  • FG2006
  • FG2006
  • 2011年08月11日 23:32
  • 1102
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法之求数组中第i大的数
举报原因:
原因补充:

(最多只允许输入30个字)