import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
private int[] A;
private int[] B;
private int[] helperA;
private int[] helperB;
private int length;
public static void main
(String[] args
){ int[] As = {2,9,5,3};
int[] Bs = {3,11,6,10};
new Ideone().sort(As,Bs);
}
public void sort(int[] As , int[] Bs) {
A = As;
B = Bs;
length = A.length;
this.helperA = new int[length];
this.helperB = new int[length];
mergesort(0, length - 1);
for(int i = 0 ; i<length ; i++)
System.
out.
println("(" + A
[i
] + "," + B
[i
]+ ")"); }
private void mergesort(int low, int high) {
// check if low issmaller then high, if not then the array is sorted
if (low < high) {
// Get the index of the element which is in the middle
int middle = low + (high - low) / 2;
// Sort the left side of the array
mergesort(low, middle);
// Sort the right side of the array
mergesort(middle + 1, high);
// Combine them both
merge(low, middle, high);
}
}
private void merge(int low, int middle, int high) {
// Copy both parts into the helper array
for (int i = low; i <= high; i++) {
helperA[i] = A[i];
helperB[i] = B[i];
}
int i = low;
int j = middle + 1;
int k = low;
// Copy the smallest values from either the left or the right side back
// to the original array
while (i <= middle && j <= high) {
if (helperA[i] <= helperA[j]) {
A[k] = helperA[i];
B[k] = helperB[i];
i++;
} else {
A[k] = helperA[j];
B[k] = helperB[j];
j++;
}
k++;
}
// Copy the rest of the left side of the array into the target array
while (i <= middle) {
A[k] = helperA[i];
B[k] = helperB[i];
k++;
i++;
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBJZGVvbmUKewoJcHJpdmF0ZSBpbnRbXSBBOwoJcHJpdmF0ZSBpbnRbXSBCOwoJcHJpdmF0ZSBpbnRbXSBoZWxwZXJBOwoJcHJpdmF0ZSBpbnRbXSBoZWxwZXJCOwoKCXByaXZhdGUgaW50IGxlbmd0aDsKCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncyl7CgkJaW50W10gQXMgPSB7Miw5LDUsM307CgkJaW50W10gQnMgPSB7MywxMSw2LDEwfTsKCQluZXcgSWRlb25lKCkuc29ydChBcyxCcyk7Cgl9CgoJcHVibGljIHZvaWQgc29ydChpbnRbXSBBcyAsIGludFtdIEJzKSB7CgkJQSA9IEFzOwoJCUIgPSBCczsKCQlsZW5ndGggPSBBLmxlbmd0aDsKCQl0aGlzLmhlbHBlckEgPSBuZXcgaW50W2xlbmd0aF07CgkJdGhpcy5oZWxwZXJCID0gbmV3IGludFtsZW5ndGhdOwoJCW1lcmdlc29ydCgwLCBsZW5ndGggLSAxKTsKCQlmb3IoaW50IGkgPSAwIDsgaTxsZW5ndGggOyBpKyspCgkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIEFbaV0gKyAiLCIgKyBCW2ldKyAgIikiKTsKCX0KCglwcml2YXRlIHZvaWQgbWVyZ2Vzb3J0KGludCBsb3csIGludCBoaWdoKSB7CgkJLy8gY2hlY2sgaWYgbG93IGlzc21hbGxlciB0aGVuIGhpZ2gsIGlmIG5vdCB0aGVuIHRoZSBhcnJheSBpcyBzb3J0ZWQKCQlpZiAobG93IDwgaGlnaCkgewoJCS8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgd2hpY2ggaXMgaW4gdGhlIG1pZGRsZQoJCWludCBtaWRkbGUgPSBsb3cgKyAoaGlnaCAtIGxvdykgLyAyOwoJCS8vIFNvcnQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgYXJyYXkKCQltZXJnZXNvcnQobG93LCBtaWRkbGUpOwoJCS8vIFNvcnQgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGFycmF5CgkJbWVyZ2Vzb3J0KG1pZGRsZSArIDEsIGhpZ2gpOwoJCS8vIENvbWJpbmUgdGhlbSBib3RoCgkJbWVyZ2UobG93LCBtaWRkbGUsIGhpZ2gpOwoJCX0KCX0KCglwcml2YXRlIHZvaWQgbWVyZ2UoaW50IGxvdywgaW50IG1pZGRsZSwgaW50IGhpZ2gpIHsKCgkJLy8gQ29weSBib3RoIHBhcnRzIGludG8gdGhlIGhlbHBlciBhcnJheQoJCWZvciAoaW50IGkgPSBsb3c7IGkgPD0gaGlnaDsgaSsrKSB7CgkJCWhlbHBlckFbaV0gPSBBW2ldOwoJCQloZWxwZXJCW2ldID0gQltpXTsKCQl9CgoJCWludCBpID0gbG93OwoJCWludCBqID0gbWlkZGxlICsgMTsKCQlpbnQgayA9IGxvdzsKCQkvLyBDb3B5IHRoZSBzbWFsbGVzdCB2YWx1ZXMgZnJvbSBlaXRoZXIgdGhlIGxlZnQgb3IgdGhlIHJpZ2h0IHNpZGUgYmFjawoJCS8vIHRvIHRoZSBvcmlnaW5hbCBhcnJheQoJCXdoaWxlIChpIDw9IG1pZGRsZSAmJiBqIDw9IGhpZ2gpIHsKCQkJaWYgKGhlbHBlckFbaV0gPD0gaGVscGVyQVtqXSkgewoJCQkJQVtrXSA9IGhlbHBlckFbaV07CgkJCQlCW2tdID0gaGVscGVyQltpXTsKCQkJCWkrKzsKCQkJfSBlbHNlIHsKCQkJCUFba10gPSBoZWxwZXJBW2pdOwoJCQkJQltrXSA9IGhlbHBlckJbal07CgkJCQlqKys7CgkJCX0KCQkJaysrOwoJCX0KCQkvLyBDb3B5IHRoZSByZXN0IG9mIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGFycmF5IGludG8gdGhlIHRhcmdldCBhcnJheQoJCXdoaWxlIChpIDw9IG1pZGRsZSkgewoJCQlBW2tdID0gaGVscGVyQVtpXTsKCQkJQltrXSA9IGhlbHBlckJbaV07CgkJCWsrKzsKCQkJaSsrOwoJCX0KCX0KfQ==