/* package whatever; // don't place package name! */
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
{
public static int[] sort(int ... unsorted) {
if (null == unsorted || unsorted.length < 2) {
return unsorted; // nothing to sort
}
// 1, 2. Find min and max
int max = unsorted[0];
int min = unsorted[0];
for (int i = 1; i < unsorted.length; i++) {
if (min > unsorted[i]) {
min = unsorted[i];
} else if (max < unsorted[i]) {
max = unsorted[i];
}
}
// 3. New array to store frequencies
int[] freq = new int[max - min + 1];
// 4. Count frequencies shifting by min elements
for (int i = 0; i < unsorted.length; i++) {
freq[unsorted[i] - min] += 1; // shift by min
}
// 5,6.Create and populate sorted array
int[] sorted = new int[unsorted.length];
for (int i = 0, ix = 0; i < freq.length; i++) {
if (freq[i] == 0) {
continue; // skip values with 0 frequency
}
while (freq[i] > 0) {
sorted[ix++] = min + i; // populate sorted array
freq[i]--;
}
}
return sorted;
}
{
System.
out.
println(Arrays.
toString(sort
(1,
4,
-2,
4,
2,
0,
-1,
2))); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCQpwdWJsaWMgc3RhdGljIGludFtdIHNvcnQoaW50IC4uLiB1bnNvcnRlZCkgewogICAgaWYgKG51bGwgPT0gdW5zb3J0ZWQgfHwgdW5zb3J0ZWQubGVuZ3RoIDwgMikgewogICAgICAgIHJldHVybiB1bnNvcnRlZDsgLy8gbm90aGluZyB0byBzb3J0CiAgICB9CiAgICAvLyAxLCAyLiBGaW5kIG1pbiBhbmQgbWF4CiAgICBpbnQgbWF4ID0gdW5zb3J0ZWRbMF07CiAgICBpbnQgbWluID0gdW5zb3J0ZWRbMF07CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPCB1bnNvcnRlZC5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChtaW4gPiB1bnNvcnRlZFtpXSkgewogICAgICAgICAgICBtaW4gPSB1bnNvcnRlZFtpXTsKICAgICAgICB9IGVsc2UgaWYgKG1heCA8IHVuc29ydGVkW2ldKSB7CiAgICAgICAgICAgIG1heCA9IHVuc29ydGVkW2ldOwogICAgICAgIH0KICAgIH0KCiAgICAvLyAzLiBOZXcgYXJyYXkgdG8gc3RvcmUgZnJlcXVlbmNpZXMKICAgIGludFtdIGZyZXEgPSBuZXcgaW50W21heCAtIG1pbiArIDFdOwoKICAgIC8vIDQuIENvdW50IGZyZXF1ZW5jaWVzIHNoaWZ0aW5nIGJ5IG1pbiBlbGVtZW50cwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bnNvcnRlZC5sZW5ndGg7IGkrKykgewogICAgICAgIGZyZXFbdW5zb3J0ZWRbaV0gLSBtaW5dICs9IDE7IC8vIHNoaWZ0IGJ5IG1pbiAKICAgIH0KCiAgICAvLyA1LDYuQ3JlYXRlIGFuZCBwb3B1bGF0ZSBzb3J0ZWQgYXJyYXkKICAgIGludFtdIHNvcnRlZCA9IG5ldyBpbnRbdW5zb3J0ZWQubGVuZ3RoXTsKCiAgICBmb3IgKGludCBpID0gMCwgaXggPSAwOyBpIDwgZnJlcS5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChmcmVxW2ldID09IDApIHsKICAgICAgICAgICAgY29udGludWU7ICAvLyBza2lwIHZhbHVlcyB3aXRoIDAgZnJlcXVlbmN5CiAgICAgICAgfQogICAgICAgIHdoaWxlIChmcmVxW2ldID4gMCkgewogICAgICAgICAgICBzb3J0ZWRbaXgrK10gPSBtaW4gKyBpOyAvLyBwb3B1bGF0ZSBzb3J0ZWQgYXJyYXkKICAgICAgICAgICAgZnJlcVtpXS0tOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc29ydGVkOwp9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCVN5c3RlbS5vdXQucHJpbnRsbihBcnJheXMudG9TdHJpbmcoc29ydCgxLCA0LCAtMiwgNCwgMiwgMCwgLTEsIDIpKSk7Cgl9Cn0=