算法实现——X和Y的中位数问题

问题描述:
设X[0:n-1]和Y[0:n-1]为2 个数组,每个数组中含有n 个已排好序的数。试设计一个
O(log n)时间的算法,找出X和Y 的2n个数的中位数。
例如,当n=7,X=[1,3,6,7,8,9,10];Y=[2,4,5,11,12,13,14]时,X 和Y
的中位数是7。
«算法设计:
对于给定的n 个元素的数组X[0:n-1]和Y[0:n-1],试设计一个O(log n)时间算法,计
算X 和Y 的中位数。
«数据输入:
输入数据由文件名为input.txt的文本文件提供。
文件的第1行是每个数组中元素个数n;接下来的2行中每行有n 个整数,分别为X 和
Y 中元素。
«结果输出:
将计算出的X 和Y 的中位数输出到文件output.txt中。
输入文件示例 输出文件示例
input.txt     output.txt
7             7   
1 3 6 7 8 9 10
2 4 5 11 12 13 14


#include 
#include 
#include 
using namespace std;

bool  IsMiddle( int a[], int b[], int max, int &i, int& upper, int& lower , int& result )
{
 bool bResult = false;
 if ( a[i] >= b[max-i-2] && a[i] <= b[max-i-1] )
 {
  result = a[i];
  if ( i== max-1 )
  {
   result+=b[0];
  }
  else
  {
   result += ( a[i+1] < b[max-i-1] ) ? a[i+1] : b[max-i-1];
  }

  bResult = true;
 }
 else
 {
  if ( a[i] < b[max-i-2])
  {
   lower=i;
   i=upper;
  }
  else
  {
   upper=i;
   i=lower;
  }
  if ( a[i] >= b[max-i-2] && a[i] <= b[max-i-1] )
  {
   bResult = true;
  }

 }
 result/=2;
 return bResult;
}

int   GetMiddle( int a1[], int a2[], int length )
{
 int result=0;
 int i1, i2, u1=length-1, l1=0, u2=length-1, l2=0;
 int index=0;

 while ( abs( l1-u1) >1 || abs( l2-u2) >1 ) 
 {
  i1 = ( l1 + u1) /2;

  if ( abs( l1-u1) >1 )
  {
   if ( IsMiddle( a1, a2, length, i1, u1, l1, result ) )
   {
    break;
   }
  }
  i2 = ( l2+u2) /2;
  if ( abs( u2-l2) >1 )
  {
   if ( IsMiddle( a2, a1, length, i2, u2, l2 , result ) )
   {
    break;
   }
  }
 }
 return result;

}


int  main() 
{ 
 string inFileName("c:\\inFile.txt");
 string outFileName("c:\\outFile.txt");
 ifstream inFile( inFileName.c_str(), ios_base::in);
 if ( inFile.fail() )
 {
  cerr<<" Open file: " << inFileName << " failed! Exit...";
  return -1;
 }
 ofstream outFile( outFileName.c_str(), ios_base::out | ios_base::trunc );
 if ( outFile.fail() )
 {
  cerr<<" Open file:" << outFileName << " failed! Exit...";
  inFile.close();
  return -1;
 }
 int len =0;

 while ( !(inFile>> len) )
 {
  inFile.clear();
  inFile.get();
 }
 if ( len <=0 )
 {
  inFile.close();
  outFile.close();
  cerr <<"Array length less or equal than zero! Exit...";
  return -1;
 }

 int *a1 = new int[len];
 int *a2 = new int[len];
 int number=0, i=0;


 for (  i=0; i>number) && !inFile.eof() );

  if ( i 
2.有两个链表[1,3,5],[2,4,7],设计一个算法将这两个链表合并为一个元素值递减的有序单向链表
3.:输入二叉树的两个节点,输出它们的最近公共祖先节点
struct node{
Node *left;
Node *right;
Node *parent}
4.上亿个单词,如何设计算法去掉其中重复的单词,要求写出程序,并估算时间和空间复杂度

你可能感兴趣的:(c++,算法,delete,string,ios,file,struct)