import java.util.* ;
import java.lang.* ;
import java.io.* ;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{ /* DESCRIPTION OF mergeThreeWay ALGORITHM
*
* merges sorted subarrays A[start...firstThird], A[firstThird+1,secondThird], and A[secondThird+1,stop]
*
* There are 3 possible cases when one merges :
* 1) all 3 sub-arrays have elements left
* 2) only 2 sub-arrays have elements left
* 3) only 1 sub-arrays have elements
*
* What action to take?
* For case 1) select the smallest element from the 3 sub-arrays and add it to the temporary array
* 2) select the smallest element from the 2 sub-arrays and add it to the temporary array
* 3) this sub-array is sorted - add all elements to the temporary array
*
* Finally, copy the temporary array to the original array
*
* The algorithm uses while loops to iterate trough the sub-arrays until one sub-array has no elements left (all of its elements have been copied to the temp array)
*/
public static void mergeThreeWay( int A[ ] , int start, int firstThird, int secondThird, int stop) {
int p1 = start;
int p2 = firstThird;
int p3 = secondThird;
int tmp[ ] = new int [ A.length ] ; // I need a temporary array of the same size as A because the sub-arrays keep their index, for example, a sub-array would look like this : [0, 0, 0, 0, 2, 9, 0, 0, 0, 0]
int tmpIndex = start;
// As long as tmpIndex as not reached the end of the array, execute the loop
while ( tmpIndex <= stop) {
// Get the smallest elements of the three sub-arrays
while ( p1 < firstThird && p2 < secondThird && p3 <= stop) {
if ( A[ p1] <= A[ p2] && A[ p1] <= A[ p3] ) {
tmp[ tmpIndex++ ] = A[ p1++ ] ;
}
else if ( A[ p2] <= A[ p1] && A[ p2] <= A[ p3] ) {
tmp[ tmpIndex++ ] = A[ p2++ ] ;
}
else if ( A[ p3] <= A[ p1] && A[ p3] <= A[ p2] ) {
tmp[ tmpIndex++ ] = A[ p3++ ] ;
} else {
tmpIndex++;
}
}
// Get the smallest elements of the two remaining sub-arrays
while ( p1 < firstThird && p2 < secondThird) {
if ( A[ p1] <= A[ p2] ) {
tmp[ tmpIndex++ ] = A[ p1++ ] ;
} else {
tmp[ tmpIndex++ ] = A[ p2++ ] ;
}
}
while ( p1 < firstThird && p3 < stop) {
if ( A[ p1] <= A[ p3] ) {
tmp[ tmpIndex++ ] = A[ p1++ ] ;
} else {
tmp[ tmpIndex++ ] = A[ p3++ ] ;
}
}
while ( p2 < secondThird && p3 < stop) {
if ( A[ 2 ] <= A[ p3] ) {
tmp[ tmpIndex++ ] = A[ p2++ ] ;
} else {
tmp[ tmpIndex++ ] = A[ p3++ ] ;
}
}
// Complete with the remaining elements
while ( p1 < firstThird) tmp[ tmpIndex++ ] = A[ p1++ ] ;
while ( p2 < secondThird) tmp[ tmpIndex++ ] = A[ p2++ ] ;
while ( p3 <= stop) tmp[ tmpIndex++ ] = A[ p3++ ] ;
tmpIndex++;
}
for ( int k= start; k <= stop; k++ ) {
A[ k] = tmp[ k] ;
}
}
{
int myArray[ ] = { 8 ,3 ,5 ,7 ,9 ,2 ,3 ,5 ,5 ,6 } ;
mergeThreeWay( myArray,0 ,1 ,5 ,9 ) ;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsvKiBERVNDUklQVElPTiBPRiBtZXJnZVRocmVlV2F5IEFMR09SSVRITQogICAgICogCiAgICAgKiBtZXJnZXMgc29ydGVkIHN1YmFycmF5cyBBW3N0YXJ0Li4uZmlyc3RUaGlyZF0sIEFbZmlyc3RUaGlyZCsxLHNlY29uZFRoaXJkXSwgYW5kIEFbc2Vjb25kVGhpcmQrMSxzdG9wXQogICAgICogCiAgICAgKiBUaGVyZSBhcmUgMyBwb3NzaWJsZSBjYXNlcyB3aGVuIG9uZSBtZXJnZXMgOgogICAgICogIDEpIGFsbCAzIHN1Yi1hcnJheXMgaGF2ZSBlbGVtZW50cyBsZWZ0CiAgICAgKiAgMikgb25seSAyIHN1Yi1hcnJheXMgaGF2ZSBlbGVtZW50cyBsZWZ0CiAgICAgKiAgMykgb25seSAxIHN1Yi1hcnJheXMgaGF2ZSBlbGVtZW50cwogICAgICogIAogICAgICogV2hhdCBhY3Rpb24gdG8gdGFrZT8KICAgICAqICBGb3IgY2FzZSAxKSBzZWxlY3QgdGhlIHNtYWxsZXN0IGVsZW1lbnQgZnJvbSB0aGUgMyBzdWItYXJyYXlzIGFuZCBhZGQgaXQgdG8gdGhlIHRlbXBvcmFyeSBhcnJheQogICAgICogICAgICAgICAgIDIpIHNlbGVjdCB0aGUgc21hbGxlc3QgZWxlbWVudCBmcm9tIHRoZSAyIHN1Yi1hcnJheXMgYW5kIGFkZCBpdCB0byB0aGUgdGVtcG9yYXJ5IGFycmF5CiAgICAgKiAgICAgICAgICAgMykgdGhpcyBzdWItYXJyYXkgaXMgc29ydGVkIC0gYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgdGVtcG9yYXJ5IGFycmF5CiAgICAgKiAKICAgICAqIEZpbmFsbHksIGNvcHkgdGhlIHRlbXBvcmFyeSBhcnJheSB0byB0aGUgb3JpZ2luYWwgYXJyYXkKICAgICAqIAogICAgICogVGhlIGFsZ29yaXRobSB1c2VzIHdoaWxlIGxvb3BzIHRvIGl0ZXJhdGUgdHJvdWdoIHRoZSBzdWItYXJyYXlzIHVudGlsIG9uZSBzdWItYXJyYXkgaGFzIG5vIGVsZW1lbnRzIGxlZnQgKGFsbCBvZiBpdHMgZWxlbWVudHMgaGF2ZSBiZWVuIGNvcGllZCB0byB0aGUgdGVtcCBhcnJheSkKICAgICAqLwogICAgcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlVGhyZWVXYXkoaW50IEFbXSwgaW50IHN0YXJ0LCBpbnQgZmlyc3RUaGlyZCwgaW50IHNlY29uZFRoaXJkLCBpbnQgc3RvcCkgewogICAgICAgIGludCBwMSA9IHN0YXJ0OwogICAgICAgIGludCBwMiA9IGZpcnN0VGhpcmQ7CiAgICAgICAgaW50IHAzID0gc2Vjb25kVGhpcmQ7CgogICAgICAgIGludCB0bXBbXSA9IG5ldyBpbnRbQS5sZW5ndGhdOyAgLy8gSSBuZWVkIGEgdGVtcG9yYXJ5IGFycmF5IG9mIHRoZSBzYW1lIHNpemUgYXMgQSBiZWNhdXNlIHRoZSBzdWItYXJyYXlzIGtlZXAgdGhlaXIgaW5kZXgsIGZvciBleGFtcGxlLCBhIHN1Yi1hcnJheSB3b3VsZCBsb29rIGxpa2UgdGhpcyA6IFswLCAwLCAwLCAwLCAyLCA5LCAwLCAwLCAwLCAwXSAgCiAgICAgICAgaW50IHRtcEluZGV4ID0gc3RhcnQ7CgogICAgICAgIC8vIEFzIGxvbmcgYXMgdG1wSW5kZXggYXMgbm90IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYXJyYXksIGV4ZWN1dGUgdGhlIGxvb3AKICAgICAgICB3aGlsZSh0bXBJbmRleCA8PSBzdG9wKSB7CgogICAgICAgICAgICAvLyBHZXQgdGhlIHNtYWxsZXN0IGVsZW1lbnRzIG9mIHRoZSB0aHJlZSBzdWItYXJyYXlzCiAgICAgICAgICAgIHdoaWxlIChwMSA8IGZpcnN0VGhpcmQgJiYgcDIgPCBzZWNvbmRUaGlyZCAmJiBwMyA8PSBzdG9wKSB7CiAgICAgICAgICAgICAgICBpZiAoQVtwMV0gPD0gQVtwMl0gJiYgQVtwMV0gPD0gQVtwM10pIHsKICAgICAgICAgICAgICAgICAgICB0bXBbdG1wSW5kZXgrK10gPSBBW3AxKytdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQVtwMl0gPD0gQVtwMV0gJiYgQVtwMl0gPD0gQVtwM10pIHsKICAgICAgICAgICAgICAgICAgICB0bXBbdG1wSW5kZXgrK10gPSBBW3AyKytdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoQVtwM10gPD0gQVtwMV0gJiYgQVtwM10gPD0gQVtwMl0pIHsKICAgICAgICAgICAgICAgICAgICB0bXBbdG1wSW5kZXgrK10gPSBBW3AzKytdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0bXBJbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBHZXQgdGhlIHNtYWxsZXN0IGVsZW1lbnRzIG9mIHRoZSB0d28gcmVtYWluaW5nIHN1Yi1hcnJheXMKICAgICAgICAgICAgd2hpbGUgKHAxIDwgZmlyc3RUaGlyZCAmJiBwMiA8IHNlY29uZFRoaXJkKSB7CiAgICAgICAgICAgICAgICBpZiAoQVtwMV0gPD0gQVtwMl0pewogICAgICAgICAgICAgICAgICAgIHRtcFt0bXBJbmRleCsrXSA9IEFbcDErK107CiAgICAgICAgICAgICAgICB9IGVsc2V7CiAgICAgICAgICAgICAgICAgICAgdG1wW3RtcEluZGV4KytdID0gQVtwMisrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKHAxIDwgZmlyc3RUaGlyZCAmJiBwMyA8IHN0b3ApIHsKICAgICAgICAgICAgICAgIGlmIChBW3AxXSA8PSBBW3AzXSkgewogICAgICAgICAgICAgICAgICAgIHRtcFt0bXBJbmRleCsrXSA9IEFbcDErK107CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRtcFt0bXBJbmRleCsrXSA9IEFbcDMrK107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlIChwMiA8IHNlY29uZFRoaXJkICYmIHAzIDwgc3RvcCkgewogICAgICAgICAgICAgICAgaWYgKEFbMl0gPD0gQVtwM10pIHsgICAgCiAgICAgICAgICAgICAgICAgICAgdG1wW3RtcEluZGV4KytdID0gQVtwMisrXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdG1wW3RtcEluZGV4KytdID0gQVtwMysrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ29tcGxldGUgd2l0aCB0aGUgcmVtYWluaW5nIGVsZW1lbnRzCgogICAgICAgICAgICB3aGlsZSAocDEgPCBmaXJzdFRoaXJkKSB0bXBbdG1wSW5kZXgrK10gPSBBW3AxKytdOwoKICAgICAgICAgICAgd2hpbGUgKHAyIDwgc2Vjb25kVGhpcmQpIHRtcFt0bXBJbmRleCsrXSA9IEFbcDIrK107CgogICAgICAgICAgICB3aGlsZSAocDMgPD0gc3RvcCkgdG1wW3RtcEluZGV4KytdID0gQVtwMysrXTsKCiAgICAgICAgICAgIHRtcEluZGV4Kys7CiAgICAgICAgfQoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLnRvU3RyaW5nKHRtcCkpOwogICAgICAgIGZvcihpbnQgaz1zdGFydDsgayA8PSBzdG9wOyBrKyspIHsKICAgICAgICAgICAgQVtrXSA9IHRtcFtrXTsKICAgICAgICB9CiAgICB9CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlpbnQgbXlBcnJheVtdID0gezgsMyw1LDcsOSwyLDMsNSw1LDZ9OwoJCW1lcmdlVGhyZWVXYXkobXlBcnJheSwwLDEsNSw5KTsKCX0KfQ==