您的位置:首页 > 编程语言 > C语言/C++

找出两个已排序且同序大小相等的数组的中位数C语言

2011-05-03 15:15 225 查看
给定两个 int 数组,都是已按照升序排好序的,并且大小相同,都是 N.在 O(log2 N)时间找出它们的中位数.搞得略头疼.但总算还是写出了代码.思想上就是,二分查找.虽然我起初用的是顺序查找.看来我的头脑还停留在线性比较上.
新的数组,假想的这个两个数组合并了的数组.其个数为偶数个,取下中位数.根据已知条件,大小相等,且都已按照升序排序.那么,如果当前查看的数是要找的中位数,则它应该满足,大于所有 2N 个数中的 N - 1 个, 并且小于其余的 N 个.这样的话,在它本身数组中,已经有了一部分,另外的一部分,应在另一个数组中.如果当前查看的树的索引为 middle, 当前查看的数组为A,另一个为B.那么,A[middle] >= A[x] {x | 0 < x < middle}.A[middle] >= B[x] {x | 0 < x < middle - 1}.这就是前面所说的大于所有 2N 个数种的 N - 1个;接下来,A[middle] <= A[x] {x | middle < x < N}.A[millde] < B[x] {x | <= middle < N}.也即小于其余的 N 个.只有在这两个条件都得到满足的情况下,A[middle]是要找的中位数.这就是我所能给出的全部分析了,接下来的部分,我的话其实很无力.因为个中道理,我都没有搞懂.所以也就不胡言乱语了.不过好像,已经胡言乱语好一阵了...
呵呵,贴代码了.

/*	9.3-8-2011-05-03-12.56.c -- 第九章第三题	*/
#include <stdio.h>

#define SIZE (8)
#define FAILED (-1)

int main (void) ;
int median (const int * const arrayA, const int * const arrayB, int left, int right) ;

int main (void)
{
	int arrayA[SIZE] = {1, 2, 4, 6, 8, 9, 11, 13} ;
	int arrayB[SIZE] = {2, 5, 5, 7, 7, 9, 10, 14} ;
	int size = SIZE ;
	int value ;
	
	value = median (arrayA, arrayB, 0, size - 1) ;
	if (FAILED == value)
		value = median (arrayB, arrayA, 0, size - 1) ;
	printf ("%d/n", value) ;

	return 0 ;
}

int median (const int * const arrayA, const int * const arrayB, int left, int right)
{
	int size ;
	int middle ;

	size = right - left + 1 ;
	while (left <= right)
	{
		middle = (left + right) / 2 ;
		if (middle == size - 1)
		{
			if (arrayA[middle] <= arrayB[0])
				return arrayA[middle] ;
			else
				return FAILED ;
		}
		else if (arrayA[middle] >= arrayB[right - middle - 1])
		{
			if (arrayA[middle] <= arrayB[right - middle])
				return arrayA[middle] ;
			else
				right = middle - 1 ;
		}
		else
			left = middle + 1 ;
	}

	return FAILED ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: