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


算法思想:将数组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;
	}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值