`
viking.liu
  • 浏览: 53664 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

查找中间数

阅读更多
package com.viking.divide;

/**
 * 
 * @author viking
 * 
 *         查找中间数 有两个长度相等,按升序排列的数组,现要查找中间数 因为有两个中间数,返回偏小的那一个
 * 
 *         中间数是数组中大小处于中间的那个数
 * 
 *         基本思路,用而分查找的方法查找
 * 
 * 
 * 
 */
public class Middle {
	public static void main(String[] args) {
		int[] a = {15,  16, 23,27 };
		int[] b = {7, 10, 12,13 };
		int mid = findMiddle(a, b);
		System.out.println(mid);
	}

	public static int findMiddle(int[] a, int[] b) {
		int n = a.length;
		int amid = 0, bmid = 0;
		int alow = 0, blow = 0;
		int ahight = n - 1, bhight = n - 1;
		while (alow < ahight && blow < bhight) {
			amid = (alow + ahight) / 2;
			bmid = (blow + bhight) / 2;
			if (a[amid] > b[bmid]) {
				// 中间数会在 a的中 alow-amid半区和b的blow-bhight半区中
				ahight = amid;
				blow = bmid;
			} else {
				// 中间数会在 b的中 blow-bmid半区和a的alow-ahight半区中
				alow = amid;
				bhight = bmid;
			}
		}
		// 由于取整问题,下标总是指向偏小的数
		// a[amid+1]或者b[bmid+1]有可能是中间数
		// middle 肯定在a[amid] a[amid+1] b[bmid] b[bmid+1]这四个数中
		// 对amid bmid 进行修正
		if (amid + bmid + 1 == n - 2) {
			if (a[amid] > b[bmid]) {
				amid++;
			} else {
				bmid++;
			}
		} else if (amid + bmid + 2 == n - 2) {
			amid++;
			bmid++;
		}

		if (a[amid] > b[bmid]) {
			if (bmid < n && a[amid] > b[bmid + 1]) {
				// bmid+1才是偏小的那个中间数
				return b[bmid + 1];
			}
			return a[amid];
		} else {
			if (amid < n && b[bmid] > a[amid + 1]) {
				// amid+1才是偏小的那个中间数
				return a[amid + 1];
			}
			return b[bmid];
		}
	}
}

分享到:
评论

相关推荐

    Hash查找、二分查找c语言关键字个数

    二分查找的基本步骤包括:首先比较中间元素与目标值,如果相等则找到,否则根据中间元素与目标值的大小关系调整搜索范围,递归地在左半部分或右半部分继续查找。由于每次查找都将搜索范围减半,二分查找的时间复杂度...

    查找算法集(顺序查找、二分查找、插值查找、动态查找)

    二分查找是一种高效的查找算法,它的实现方式是将数组或链表分成两个部分,然后比较目标元素和中间元素,如果目标元素小于中间元素,则在左半部分继续查找,否则在右半部分继续查找。二分查找的时间复杂度为O(logn)...

    折半查找(二分查找)折半查找(二分查找)折半查找(二分查找)

    1. 确定中间位置记录的序号 m = [(n + 1)/2],其中 n 为记录个数。 2. 将给定值 K 与中间位置记录的关键字值进行比较,有三种可能的结果: * K = r[m].key:查找成功,结束查找。 * K [m].key:继续在左半部分...

    数据结-构查找算法二分查找二叉顺序数哈希查找

    算法的基本思路是将查找区间不断减半,每次比较中间元素与目标值,如果目标值等于中间元素则查找成功,否则根据目标值与中间元素的大小关系缩小查找区间。二分查找的时间复杂度为O(logn),在大规模数据查找时效率较...

    带权中位数查找O(n)C++

    在无权的情况下,中位数是将一组数值从小到大排序后位于中间位置的数,如果数据个数为奇数,则中位数是中间的那个数;如果是偶数,则是中间两个数的平均值。而在带权的情况下,每个数都有一个对应的权重,中位数不再...

    一个可以查找中位数的AVL树实现

    如果树允许重复节点,并且我们要找到的是真正的中位数(即所有不同值的中间值),那么我们需要考虑以下策略: 1. **重复节点计数**:在AVL树中处理重复节点时,每个节点不仅要存储键值,还需要存储该键值出现的次数...

    二分实现两个递增序列中位数查找

    本文将深入探讨如何使用二分算法在两个递增序列中查找中位数,这是一个典型的数据结构与算法相结合的问题。 首先,我们要理解什么是中位数。在一组数值中,中位数是指将这些数值按大小顺序排列后处于中间位置的数。...

    二分查找、插值查找、斐波那契查找对比C++的实现

    它的工作原理是首先找到数组的中间元素,然后比较目标值与中间元素的关系,如果目标值等于中间元素,则查找成功;若目标值小于中间元素,则在左半部分数组中继续查找;反之,在右半部分查找。每次查找都将搜索范围...

    echarts饼状图中间展示数字

    你可以访问ECharts的官方网站,查找关于饼图中间显示数字的实例,通过查看源码并进行实践,可以加深对这个功能的理解。 至于【压缩包子文件的文件名称列表】"echarts饼状图中间展示数组",这可能是指一个包含示例...

    二分查找 杨辉三角 数组便利

    如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 代码中...

    折半查找 c语言函数

    在这个例子中,我们定义了一个名为`binsearch`的函数,它接受一个整数数组、目标值和数组大小作为参数。在`main`函数中,我们创建了一个有序数组,并调用`binsearch`函数查找目标值7的位置。如果找到,输出其在数组...

    二分查找解题

    3. 如果目标值小于中间元素,那么在数组的左半部分(即中间元素左边的部分)继续查找。 4. 如果目标值大于中间元素,那么在数组的右半部分(即中间元素右边的部分)继续查找。 5. 重复以上步骤,直至找到目标值或...

    两种查找算法,二叉树查找,折半查找

    3. 重复上述过程,直到找到目标值或者查找区间为空,此时可以判断目标值不存在于原始数组中。 折半查找的时间复杂度为O(log n),这是因为每次操作都使查找范围减半。这使得它在大型有序数据集上非常高效。 接下来...

    折半查找的递归算法

    如果中间元素不是目标值,则根据目标值与中间元素的大小关系进一步缩小查找范围,重复上述过程直到找到目标值或确定目标值不存在于数组中。 具体步骤如下: 1. 计算中间位置的索引:`mid = (low + high) / 2`。 2. ...

    折半查找(C++语言编写的)

    3. 比较中间值:将目标元素与中间值进行比较,如果目标元素小于中间值,则查找范围缩小到中间值左侧,否则查找范围缩小到中间值右侧。 4. 重复步骤2-3:直到查找范围缩小到只包含一个元素时,判断该元素是否为目标...

    海量数据查找数据问题

    在小规模数据中,我们可以直接排序后取中间位置的数,但在海量数据中,直接排序是不切实际的。因此,我们需要采用更高效的方法,如“快速选择”或“线性时间复杂度的中位数查找算法”。 快速选择算法基于快速排序的...

    折半查找算法的改进和程序实现

    折半查找算法是一种在有序数组中寻找特定元素的搜索算法,其基本思想是将数组分为两半,通过比较中间元素和目标值来缩小搜索范围。然而,传统的折半查找在某些情况下并不一定是效率最高的方法。通过对查找算法的改进...

    用c语言设计查找算法

    首先,找到中间元素,如果目标值等于中间元素,查找结束;如果目标值小于中间元素,继续在左半部分查找;否则,在右半部分查找。每次比较都使搜索范围减半,直到找到目标元素或搜索范围为空。 7. **二插排序树**: ...

    分段连续数字跳号查找

    这样的序列就包含两个连续的子序列 {1, 2, 3} 和 {5, 6, 8, 9, 10},中间由不连续的数字分隔。 接下来,我们要解决的是“查找不连续”的问题。在传统的线性查找中,如果目标值存在于序列中,我们需要遍历整个序列...

Global site tag (gtag.js) - Google Analytics