算法 - 有两个相同大小数组均已按升序排列好,编程计算这两个数组的中位数(C++)
2012-07-07 23:17
507 查看
/*
Let X[0..n-1] and Y[0..n-1] be the two arrays, each containing n numbers already in the sorted order.
Give an O(log n) time algorithm to find the median of all 2n elements in array X and Y.
*/
#include <iostream>
using namespace std;
template <typename T>
T median2 (T* X, T* Y, int size)
{
int m = (size - 1) / 2;
if (X[m] == Y[m])
{
return X[m];
}
else if (X[m] > Y[m])
{
return size == 1 ? Y[m] : median2 (X, Y + size - m - 1, m + 1);
}
else
{
return size == 1 ? X[m] : median2 (X + size - m - 1, Y, m + 1);
}
}
void main()
{
int a[6] = {1, 2, 3, 7, 19};
int b[6] = {12, 13, 25, 28, 33};
int median = median2(a, b, 5);
cout << median << endl;
}
// Output:
/*
12
*/
Let X[0..n-1] and Y[0..n-1] be the two arrays, each containing n numbers already in the sorted order.
Give an O(log n) time algorithm to find the median of all 2n elements in array X and Y.
*/
#include <iostream>
using namespace std;
template <typename T>
T median2 (T* X, T* Y, int size)
{
int m = (size - 1) / 2;
if (X[m] == Y[m])
{
return X[m];
}
else if (X[m] > Y[m])
{
return size == 1 ? Y[m] : median2 (X, Y + size - m - 1, m + 1);
}
else
{
return size == 1 ? X[m] : median2 (X + size - m - 1, Y, m + 1);
}
}
void main()
{
int a[6] = {1, 2, 3, 7, 19};
int b[6] = {12, 13, 25, 28, 33};
int median = median2(a, b, 5);
cout << median << endl;
}
// Output:
/*
12
*/
相关文章推荐
- C/C++面试题(1):交换两个相同大小的整型数组
- 求两个相同大小已排序数组中的中位数
- 求两个长度相同的升序数组的中位数
- 两个数组,大小都为n,两个数组里有相同的元素,设计一个算法,找到两个数组中相同的元素
- 算法系列-两个有序数组中相同的数字
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 网新恒天笔试题,有两个整形数组A和B,请编程去除这两个数组间的交集。若有相同元素,则在相同元素较多的数组中保留它。例如,数组A有三个1,数组B有两个1,程序将删除数组B中的两个1.
- 找出两个已排序且同序大小相等的数组的中位数C语言
- 求两个有序数组的中位数-算法导论
- 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。
- 有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度
- C语随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数放入数组b中,
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- C或C++ 求两个数组相同元素个数
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 给定两个长度相同,分别有序的数组A和B,求两个数组中所有数的中位数
- 两个升序数组的中位数
- (***)有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, 如果 B 的元素小于 A 的元素进行数值交换:(使用回调函数实现)
- * 期末考试 编程题#5:计算数组的低3位之和(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;for_each用法)