33,010
社区成员
发帖
与我相关
我的任务
分享
private void button1_Click(object sender, EventArgs e)
{
int[] A = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] B = new int[] { 0, 0, 0, 2, 3, 9, 9, 10, 10, 11 };
double median = findMedian(A, B, 0, A.Length - 1);
}
private double findMedian(int[] ArrayA, int[] ArrayB, int startIndex, int endIndex)
{
int length = ArrayA.Length - 1;
int medianIndexA = (startIndex + endIndex) / 2;
int medianIndexB = length - medianIndexA;
//如果到边界了,直接返回边界的均值
if(startIndex == length || endIndex == 0)
return (double)(ArrayA[medianIndexA] + ArrayB[medianIndexB]) / 2;
//如果A的元素在两个B元素中间,或B元素在两个A元素中间,返回四个元素中中间2个的均值
if ((ArrayA[medianIndexA] < ArrayB[medianIndexB] && ArrayA[medianIndexA] >= ArrayB[medianIndexB - 1]) || (ArrayA[medianIndexA] < ArrayB[medianIndexB] && ArrayA[medianIndexA + 1] >= ArrayB[medianIndexB]))
return (double)(Math.Max(ArrayA[medianIndexA], ArrayB[medianIndexB - 1]) + Math.Min(ArrayA[medianIndexA + 1], ArrayB[medianIndexB])) / 2;
//如果=直接返回,说明找到了
if (ArrayA[medianIndexA] == ArrayB[medianIndexB])
return ArrayA[medianIndexA];
else if (ArrayA[medianIndexA] < ArrayB[medianIndexB])
//递归找更大的数
return findMedian(ArrayA, ArrayB, medianIndexA + 1, endIndex);
else
//递归找更小的数
return findMedian(ArrayA, ArrayB, startIndex, medianIndexA - 1);
}