查找两个等长升序线性表的中位数

  • 一个长度为L(L≥1)的升序序列S,处在第éL/2ù个位置的数称为S的中位数。例如,若序列S1=(11, 13, 15, 17, 19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2, 4, 6, 8, 20),则S1和S2的中位数是11。现有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法。
  • 思考:如果这些数据已有序排列在一个序列中,则只通过一次下标计算,即可求得中位数。题目中所给的数据分属于两个有序序列,其中位数的位置不能再通过简单计算确定。该题可以有多种思路,例如,将两个有序序列归并为一个有序序列后再求其中位数,即可求解。但题目中要求“设计一个在时间和空间两方面都尽可能高效的算法”,这是解题的关键。显然,仅用归并过程求解不能满足要求。由于要处理的序列是升序序列,所以该题的处理过程也可借鉴对有序表进行2路归并的思想,代码如下:
int M_Search( int A[ ], int B[ ],int n )   
   i = j = k = 0;
   while ( i<n && j<n )
   {    k++;
         if( A[i] < B[j] )
         {     i++;
                if( k==n )
                       returnA[i-1];
         }
         else
         {     j++;
                if( k==n )
                       returnB[j-1];
         }  
   }
}
posted @ 2016-07-26 17:39  eversliver  阅读(1341)  评论(0编辑  收藏  举报