/* package whatever; // don't place package name! */
class MedianOfTwoArrays {
public static void main
(String[] args
) { // Note: These are sorted arrays and are of equal length.
int[] array1 = {1, 3, 5, 7, 9, 11}; // median is 6
int[] array2 = {2, 4, 6, 8, 10, 12};
int median = getMedianOfTwoArrays(array1, array2);
System.
out.
println("Median is: " + median
); }
static int getMedianOfTwoArrays(int[] array1, int[] array2) {
int index1 = array1.length/2;
int index2 = array2.length/2;
int m1 = array1[index1];
int m2 = array2[index2];
if(m1 == m2) {
return m1;
} else {
return findMedian(array1, array2, 0, array1.length - 1, 0, array2.length - 1);
}
}
static int findMedian(int[] array1,
int[] array2,
int low1,
int high1,
int low2,
int high2) {
// termination condition
// System.out.println("low1: " + low1 + "\thigh1: " + high1 + "\tlow2: " + low2 + "\thigh2: " + high2);
if(2 == (high1 - low1 + 1) && 2 == (high2 - low2 + 1)) {
return (Math.
max(array1
[low1
], array2
[low2
]) + Math.
min(array1
[high1
], array2
[high2
]))/2; }
int length = high1 - low1 + 1;
int m1 = median(array1, low1, high1);
int m2 = median(array2, low2, high2);
// System.out.println("Median-1: " + m1 + "\t Median-2: " + m2 + "\n");
int low11 = 0;
int high11 = 0;
int low12 = 0;
int high12 = 0;
if(m1 == m2) {
return m1;
} else if(m1 > m2) {
if(length % 2 == 0) {
low11 = low1;
high11 = high1 - length/2 + 1;
low12 = low2 + length/2 - 1;
high12 = high2;
} else {
low11 = low1;
high11 = high1 - length/2;
low12 = low2 + length/2;
high12 = high2;
}
return findMedian(array1, array2, low11, high11, low12, high12);
} else {
if(length % 2 == 0) {
low11 = low1 + length/2 - 1;
high11 = high1;
low12 = low2;
high12 = high2 - length/2 + 1;
} else {
low11 = low1 + length/2;
high11 = high1;
low12 = low2;
high12 = high2 - length/2;
}
return findMedian(array1, array2, low11, high11, low12, high12);
}
} // method
static int median(int[] array,
int low,
int high) {
if((low + high) % 2 == 0) {
return array[(low + high) / 2];
} else {
int mid = (low + high)/2;
return (array[mid] + array[mid - 1])/2;
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKY2xhc3MgTWVkaWFuT2ZUd29BcnJheXMgewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoJCS8vIE5vdGU6IFRoZXNlIGFyZSBzb3J0ZWQgYXJyYXlzIGFuZCBhcmUgb2YgZXF1YWwgbGVuZ3RoLgoJCWludFtdIGFycmF5MSA9IHsxLCAzLCA1LCA3LCA5LCAxMX07IC8vIG1lZGlhbiBpcyA2CgkJaW50W10gYXJyYXkyID0gezIsIDQsIDYsIDgsIDEwLCAxMn07CgoJCWludCBtZWRpYW4gPSBnZXRNZWRpYW5PZlR3b0FycmF5cyhhcnJheTEsIGFycmF5Mik7CgkJU3lzdGVtLm91dC5wcmludGxuKCJNZWRpYW4gaXM6ICIgKyBtZWRpYW4pOwoJfQoKCXN0YXRpYyBpbnQgZ2V0TWVkaWFuT2ZUd29BcnJheXMoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpIHsKCQlpbnQgaW5kZXgxID0gYXJyYXkxLmxlbmd0aC8yOwoJCWludCBpbmRleDIgPSBhcnJheTIubGVuZ3RoLzI7CgoJCWludCBtMSA9IGFycmF5MVtpbmRleDFdOwoJCWludCBtMiA9IGFycmF5MltpbmRleDJdOwoKCQlpZihtMSA9PSBtMikgewoJCQlyZXR1cm4gbTE7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGZpbmRNZWRpYW4oYXJyYXkxLCBhcnJheTIsIDAsIGFycmF5MS5sZW5ndGggLSAxLCAwLCBhcnJheTIubGVuZ3RoIC0gMSk7CgkJfQoJfQoKCXN0YXRpYyBpbnQgZmluZE1lZGlhbihpbnRbXSBhcnJheTEsIAoJCQkJCQkJaW50W10gYXJyYXkyLAoJCQkJCQkJCWludCBsb3cxLCAKCQkJCQkJCQkJaW50IGhpZ2gxLAoJCQkJCQkJCQkJaW50IGxvdzIsIAoJCQkJCQkJCQkJCWludCBoaWdoMikgewoJCS8vIHRlcm1pbmF0aW9uIGNvbmRpdGlvbgoJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibG93MTogIiArIGxvdzEgKyAiXHRoaWdoMTogIiArIGhpZ2gxICsgIlx0bG93MjogIiArIGxvdzIgKyAiXHRoaWdoMjogIiArIGhpZ2gyKTsKCgkJaWYoMiA9PSAoaGlnaDEgLSBsb3cxICsgMSkgJiYgMiA9PSAoaGlnaDIgLSBsb3cyICsgMSkpIHsKCQkJcmV0dXJuIChNYXRoLm1heChhcnJheTFbbG93MV0sIGFycmF5Mltsb3cyXSkgKyBNYXRoLm1pbihhcnJheTFbaGlnaDFdLCBhcnJheTJbaGlnaDJdKSkvMjsKCQl9CgoJCWludCBsZW5ndGggPSBoaWdoMSAtIGxvdzEgKyAxOwoKCQlpbnQgbTEgPSBtZWRpYW4oYXJyYXkxLCBsb3cxLCBoaWdoMSk7CgkJaW50IG0yID0gbWVkaWFuKGFycmF5MiwgbG93MiwgaGlnaDIpOwoJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWVkaWFuLTE6ICIgKyBtMSArICJcdCBNZWRpYW4tMjogIiArIG0yICsgIlxuIik7CgoJCWludCBsb3cxMSA9IDA7CgkJaW50IGhpZ2gxMSA9IDA7CgkJaW50IGxvdzEyID0gMDsKCQlpbnQgaGlnaDEyID0gMDsKCgkJaWYobTEgPT0gbTIpIHsKCQkJcmV0dXJuIG0xOwoJCX0gZWxzZSBpZihtMSA+IG0yKSB7CgkJCWlmKGxlbmd0aCAlIDIgPT0gMCkgewoJCQkJbG93MTEgPSBsb3cxOwoJCQkJaGlnaDExID0gaGlnaDEgLSBsZW5ndGgvMiArIDE7CgkJCQlsb3cxMiA9IGxvdzIgKyBsZW5ndGgvMiAtIDE7CgkJCQloaWdoMTIgPSBoaWdoMjsJCgkJCX0gZWxzZSB7CgkJCQlsb3cxMSA9IGxvdzE7CgkJCQloaWdoMTEgPSBoaWdoMSAtIGxlbmd0aC8yOwoJCQkJbG93MTIgPSBsb3cyICsgbGVuZ3RoLzI7CgkJCQloaWdoMTIgPSBoaWdoMjsKCQkJfQoJCQlyZXR1cm4gZmluZE1lZGlhbihhcnJheTEsIGFycmF5MiwgbG93MTEsIGhpZ2gxMSwgbG93MTIsIGhpZ2gxMik7CgkJfSBlbHNlIHsKCQkJaWYobGVuZ3RoICUgMiA9PSAwKSB7CgkJCQlsb3cxMSA9IGxvdzEgKyBsZW5ndGgvMiAtIDE7CgkJCQloaWdoMTEgPSBoaWdoMTsKCQkJCWxvdzEyID0gbG93MjsKCQkJCWhpZ2gxMiA9IGhpZ2gyIC0gbGVuZ3RoLzIgKyAxOwoJCQl9IGVsc2UgewoJCQkJbG93MTEgPSBsb3cxICsgbGVuZ3RoLzI7CgkJCQloaWdoMTEgPSBoaWdoMTsKCQkJCWxvdzEyID0gbG93MjsKCQkJCWhpZ2gxMiA9IGhpZ2gyIC0gbGVuZ3RoLzI7CgkJCX0KCQkJcmV0dXJuIGZpbmRNZWRpYW4oYXJyYXkxLCBhcnJheTIsIGxvdzExLCBoaWdoMTEsIGxvdzEyLCBoaWdoMTIpOwoJCX0KCX0gLy8gbWV0aG9kCgoJc3RhdGljIGludCBtZWRpYW4oaW50W10gYXJyYXksIAoJCQkJCQlpbnQgbG93LCAKCQkJCQkJCWludCBoaWdoKSB7CgkJaWYoKGxvdyArIGhpZ2gpICUgMiA9PSAwKSB7CgkJCXJldHVybiBhcnJheVsobG93ICsgaGlnaCkgLyAyXTsKCQl9IGVsc2UgewoJCQlpbnQgbWlkID0gKGxvdyArIGhpZ2gpLzI7CgkJCXJldHVybiAoYXJyYXlbbWlkXSArIGFycmF5W21pZCAtIDFdKS8yOwoJCX0KCX0KCn0=