1. 程式人生 > 其它 >求兩個數組合並後的中位數

求兩個數組合並後的中位數

技術標籤: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]; }