求兩個數組合並後的中位數
阿新 • • 發佈:2021-01-12
技術標籤:C++從零開始
按照順序排列的兩個陣列,陣列A:[a1,a2,…,an],陣列B:[b1,b2,…,bn],求合併後的陣列C:[c1,c2,…,c2n]的中位數
1、求A、B兩陣列各自的中位數m1,m2;
2、比較m1,m2,:
若m1 = m2,合併後中位數仍等於m1;
若m1 < m2,捨棄陣列A左半部分和陣列B右半部分,要求捨棄的元素數目一致
若m1 > m2,捨棄陣列A右半部分和陣列B左半部分,要求捨棄的元素數目一致
3、重複步驟2直至A、B兩陣列都只剩一個元素
C++實現:
int M_search(int A[], int B[], int n) {
int s1 = 0, d1 = n - 1, m1, s2 = 0, d2 = n - 1, m2;
while (s1 != d1 || s2 != d2) //重複該過程直至兩數列中僅剩一個元素
{
m1 = (s1 + d1) / 2;
m2 = (s2 + d2) / 2; //表示兩個數列的中位數
if (A[m1]==B[m2]) //步驟1:若兩個數列中位數ab相等,則a即為所求
{
return A[m1];
}
if (A[m1] < B[m2]) //步驟2:若兩個數列中位數a<b,則去掉數列A左半部分和數列B右半部分
{
if ((s1+ d1)%2==0) //量數列剩餘項數為奇數,等價於(d1-s1)%2==0,(2,8)共7個數,保留中位數a點
{
s1 = m1;
d2 = m2;
}
else //量數列剩餘項數為偶數,等價於(d1-s1)%2==1,(2,7)共6個數,去除前一半時不保留中位數a點
{
s1 = m1 + 1;
d2 = m2;
}
}
else
{
if ((s1 + d1) % 2 == 0) //量數列剩餘項數為奇數,等價於(d1-s1)%2==0,(2,8)共7個數,去除前一半時不保留中位數a點
{
s2 = m2;
d1 = m1;
}
else //量數列剩餘項數為偶數,等價於(d1-s1)%2==1,(2,7)共6個數,保留中位數a點
{
s2 = m2 + 1;
d1 = m1;
}
}
}
return A[s1] < B[s2] ? A[s1] : B[s2];
}