import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.Arrays;
import java.util.Random;
class ThanosMeanArrays
{ // Сортирует на месте (перезаписывает исходный массив)
public static void thanosSortInPlace(int[] a)
{ if (a == null || a.length < 2) return;
int[] sorted = sortCopy(a);
System.
arraycopy(sorted,
0, a,
0, a.
length); }
// Сортирует Double на месте (перезаписывает исходный массив)
public static void thanosDSortInPlace(double[] a)
{ if (a == null || a.length < 2) return;
double[] sorted = sortDoubleCopy(a);
System.
arraycopy(sorted,
0, a,
0, a.
length); }
// Рекурсия на подмассивах:
// сегмент -> (left,right) -> sort(left), sort(right) -> concat
private static int[] sortCopy(int[] seg)
{ int n = seg.length;
if (n
< 2) return Arrays.
copyOf(seg, n
);
// Быстрый выход: все элементы равны
int mn = seg[0], mx = seg[0];
long sum = seg[0];
for (int i = 1; i < n; i++)
{ int v = seg[i];
if (v < mn) mn = v;
if (v > mx) mx = v;
sum += v;
}
if (mn
== mx
) return Arrays.
copyOf(seg, n
);
// Среднее текущего сегмента
double c = sum / (double) n;
// Подсчёт размеров левой и правой частей
int cntL = 0, cntR = 0;
for (int v : seg) if (v <= c) cntL++; else cntR++;
// Заполняем подмассивы
int[] left = new int[cntL];
int[] right = new int[cntR];
int iL = 0, iR = 0;
for (int v : seg)
{ if (v <= c) left[iL++] = v;
else right[iR++] = v;
}
// Рекурсия на подмассивах
left = sortCopy(left);
right = sortCopy(right);
// Склейка
int[] out = new int[n];
System.
arraycopy(left,
0, out,
0, left.
length); System.
arraycopy(right,
0, out, left.
length, right.
length); return out;
}
// Рекурсия на подмассивах:
// сегмент -> (left,right) -> sort(left), sort(right) -> concat
private static double[] sortDoubleCopy(double[] seg)
{ int n = seg.length;
if (n
< 2) return Arrays.
copyOf(seg, n
);
// Быстрый выход: все элементы равны
double mn = seg[0], mx = seg[0];
double sum = seg[0];
for (int i = 1; i < n; i++)
{ double v = seg[i];
if (v < mn) mn = v;
if (v > mx) mx = v;
sum += v;
}
if (mn
== mx
) return Arrays.
copyOf(seg, n
);
// Среднее текущего сегмента
double c = sum / (double) n;
// Подсчёт размеров левой и правой частей
int cntL = 0, cntR = 0;
for (double v : seg) if (v <= c) cntL++; else cntR++;
// Заполняем подмассивы
double[] left = new double[cntL];
double[] right = new double[cntR];
int iL = 0, iR = 0;
for (double v : seg)
{ if (v <= c) left[iL++] = v;
else right[iR++] = v;
}
// Рекурсия на подмассивах
left = sortDoubleCopy(left);
right = sortDoubleCopy(right);
// Склейка
double[] out = new double[n];
System.
arraycopy(left,
0, out,
0, left.
length); System.
arraycopy(right,
0, out, left.
length, right.
length); return out;
}
//********** Универсальный random метод
public static double[] generateDoubleRandomArray(int n, double min, double max)
double[] arr = new double[n];
for (int i = 0; i < n; i++)
{ arr[i] = min + rnd.nextDouble() * (max - min); // [min..max)
}
return arr;
}
public static int[] generateRandomArray(int n, int min, int max)
int[] arr = new int[n];
for (int i = 0; i < n; i++)
{ arr[i] = rnd.nextInt(max - min + 1) + min; // [min..max]
}
return arr;
}
public static void main
(String[] args
) { int[] x = {5, 1, 9, 3, 7, 2, 2, 8, 4, 6};
thanosSortInPlace(x);
int[] arr = generateRandomArray(15, -100, 100);
int[] t1 = arr.clone();
System.
out.
println("start Main int test code watch."); thanosSortInPlace(t1);
System.
out.
println("stop watch."); System.
out.
printf("Thanos main int test code : %.2f ms%n",
(t1n
- t0
) / 1e6
);
double[] arrD = generateDoubleRandomArray(15, -1, 1);
System.
out.
println("arrD before : " + Arrays.
toString(arrD
)); double[] t2 = arrD.clone();
System.
out.
println("start Double test code watch."); thanosDSortInPlace(t2);
System.
out.
println("stop watch."); System.
out.
printf("Thanos Double test code : %.2f ms%n",
(t2n
- t02
) / 1e6
); }
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIApjbGFzcyBUaGFub3NNZWFuQXJyYXlzIAp7ICAgLy8g0KHQvtGA0YLQuNGA0YPQtdGCINC90LAg0LzQtdGB0YLQtSAo0L/QtdGA0LXQt9Cw0L/QuNGB0YvQstCw0LXRgiDQuNGB0YXQvtC00L3Ri9C5INC80LDRgdGB0LjQsikKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0aGFub3NTb3J0SW5QbGFjZShpbnRbXSBhKSAKICAgIHsgaWYgKGEgPT0gbnVsbCB8fCBhLmxlbmd0aCA8IDIpIHJldHVybjsKICAgICAgICBpbnRbXSBzb3J0ZWQgPSBzb3J0Q29weShhKTsKICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNvcnRlZCwgMCwgYSwgMCwgYS5sZW5ndGgpOwogICAgfQoKICAgIC8vINCh0L7RgNGC0LjRgNGD0LXRgiBEb3VibGUg0L3QsCDQvNC10YHRgtC1ICjQv9C10YDQtdC30LDQv9C40YHRi9Cy0LDQtdGCINC40YHRhdC+0LTQvdGL0Lkg0LzQsNGB0YHQuNCyKQogICAgcHVibGljIHN0YXRpYyB2b2lkIHRoYW5vc0RTb3J0SW5QbGFjZShkb3VibGVbXSBhKSAKICAgIHsgaWYgKGEgPT0gbnVsbCB8fCBhLmxlbmd0aCA8IDIpIHJldHVybjsKICAgICAgICBkb3VibGVbXSBzb3J0ZWQgPSBzb3J0RG91YmxlQ29weShhKTsKICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNvcnRlZCwgMCwgYSwgMCwgYS5sZW5ndGgpOwogICAgfQogCiAgICAvLyDQoNC10LrRg9GA0YHQuNGPINC90LAg0L/QvtC00LzQsNGB0YHQuNCy0LDRhTogCiAgICAvLyDRgdC10LPQvNC10L3RgiAtPiAobGVmdCxyaWdodCkgLT4gc29ydChsZWZ0KSwgc29ydChyaWdodCkgLT4gY29uY2F0CiAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBzb3J0Q29weShpbnRbXSBzZWcpICAKICAgIHsgICBpbnQgbiA9IHNlZy5sZW5ndGg7CiAgICAgICAgaWYgKG4gPCAyKSByZXR1cm4gQXJyYXlzLmNvcHlPZihzZWcsIG4pOwogCiAgICAgICAgLy8g0JHRi9GB0YLRgNGL0Lkg0LLRi9GF0L7QtDog0LLRgdC1INGN0LvQtdC80LXQvdGC0Ysg0YDQsNCy0L3RiwogICAgICAgIGludCBtbiA9IHNlZ1swXSwgbXggPSBzZWdbMF07CiAgICAgICAgbG9uZyBzdW0gPSBzZWdbMF07CgogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKSAKICAgICAgICB7IGludCB2ID0gc2VnW2ldOwogICAgICAgICAgICBpZiAodiA8IG1uKSBtbiA9IHY7CiAgICAgICAgICAgIGlmICh2ID4gbXgpIG14ID0gdjsKICAgICAgICAgICAgc3VtICs9IHY7CiAgICAgICAgfQoKICAgICAgICBpZiAobW4gPT0gbXgpIHJldHVybiBBcnJheXMuY29weU9mKHNlZywgbik7CiAKICAgICAgICAvLyDQodGA0LXQtNC90LXQtSDRgtC10LrRg9GJ0LXQs9C+INGB0LXQs9C80LXQvdGC0LAKICAgICAgICBkb3VibGUgYyA9IHN1bSAvIChkb3VibGUpIG47CiAKICAgICAgICAvLyDQn9C+0LTRgdGH0ZHRgiDRgNCw0LfQvNC10YDQvtCyINC70LXQstC+0Lkg0Lgg0L/RgNCw0LLQvtC5INGH0LDRgdGC0LXQuQogICAgICAgIGludCBjbnRMID0gMCwgY250UiA9IDA7CiAgICAgICAgZm9yIChpbnQgdiA6IHNlZykgaWYgKHYgPD0gYykgY250TCsrOyBlbHNlIGNudFIrKzsKIAogICAgICAgIC8vINCX0LDQv9C+0LvQvdGP0LXQvCDQv9C+0LTQvNCw0YHRgdC40LLRiwogICAgICAgIGludFtdIGxlZnQgPSBuZXcgaW50W2NudExdOwogICAgICAgIGludFtdIHJpZ2h0ID0gbmV3IGludFtjbnRSXTsKICAgICAgICBpbnQgaUwgPSAwLCBpUiA9IDA7CgogICAgICAgIGZvciAoaW50IHYgOiBzZWcpIAogICAgICAgIHsgaWYgKHYgPD0gYykgbGVmdFtpTCsrXSA9IHY7CiAgICAgICAgICAgIGVsc2UgICAgICAgIHJpZ2h0W2lSKytdID0gdjsKICAgICAgICB9CiAKICAgICAgICAvLyDQoNC10LrRg9GA0YHQuNGPINC90LAg0L/QvtC00LzQsNGB0YHQuNCy0LDRhQogICAgICAgIGxlZnQgID0gc29ydENvcHkobGVmdCk7CiAgICAgICAgcmlnaHQgPSBzb3J0Q29weShyaWdodCk7CiAKICAgICAgICAvLyDQodC60LvQtdC50LrQsAogICAgICAgIGludFtdIG91dCA9IG5ldyBpbnRbbl07CiAgICAgICAgU3lzdGVtLmFycmF5Y29weShsZWZ0LCAgMCwgb3V0LCAwLCBsZWZ0Lmxlbmd0aCk7CiAgICAgICAgU3lzdGVtLmFycmF5Y29weShyaWdodCwgMCwgb3V0LCBsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTsKICAgICAgICByZXR1cm4gb3V0OwogICAgfQoKICAgIC8vINCg0LXQutGD0YDRgdC40Y8g0L3QsCDQv9C+0LTQvNCw0YHRgdC40LLQsNGFOiAKICAgIC8vINGB0LXQs9C80LXQvdGCIC0+IChsZWZ0LHJpZ2h0KSAtPiBzb3J0KGxlZnQpLCBzb3J0KHJpZ2h0KSAtPiBjb25jYXQKICAgIHByaXZhdGUgc3RhdGljIGRvdWJsZVtdIHNvcnREb3VibGVDb3B5KGRvdWJsZVtdIHNlZykgCiAgICB7IGludCBuID0gc2VnLmxlbmd0aDsKICAgICAgICBpZiAobiA8IDIpIHJldHVybiBBcnJheXMuY29weU9mKHNlZywgbik7CiAKICAgICAgICAvLyDQkdGL0YHRgtGA0YvQuSDQstGL0YXQvtC0OiDQstGB0LUg0Y3Qu9C10LzQtdC90YLRiyDRgNCw0LLQvdGLCiAgICAgICAgZG91YmxlIG1uID0gc2VnWzBdLCBteCA9IHNlZ1swXTsKICAgICAgICBkb3VibGUgc3VtID0gc2VnWzBdOwoKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgCiAgICAgICAgeyBkb3VibGUgdiA9IHNlZ1tpXTsKICAgICAgICAgICAgaWYgKHYgPCBtbikgbW4gPSB2OwogICAgICAgICAgICBpZiAodiA+IG14KSBteCA9IHY7CiAgICAgICAgICAgIHN1bSArPSB2OwogICAgICAgIH0KCiAgICAgICAgaWYgKG1uID09IG14KSByZXR1cm4gQXJyYXlzLmNvcHlPZihzZWcsIG4pOwogCiAgICAgICAgLy8g0KHRgNC10LTQvdC10LUg0YLQtdC60YPRidC10LPQviDRgdC10LPQvNC10L3RgtCwCiAgICAgICAgZG91YmxlIGMgPSBzdW0gLyAoZG91YmxlKSBuOwogCiAgICAgICAgLy8g0J/QvtC00YHRh9GR0YIg0YDQsNC30LzQtdGA0L7QsiDQu9C10LLQvtC5INC4INC/0YDQsNCy0L7QuSDRh9Cw0YHRgtC10LkKICAgICAgICBpbnQgY250TCA9IDAsIGNudFIgPSAwOwogICAgICAgIGZvciAoZG91YmxlIHYgOiBzZWcpIGlmICh2IDw9IGMpIGNudEwrKzsgZWxzZSBjbnRSKys7CiAKICAgICAgICAvLyDQl9Cw0L/QvtC70L3Rj9C10Lwg0L/QvtC00LzQsNGB0YHQuNCy0YsKICAgICAgICBkb3VibGVbXSBsZWZ0ID0gbmV3IGRvdWJsZVtjbnRMXTsKICAgICAgICBkb3VibGVbXSByaWdodCA9IG5ldyBkb3VibGVbY250Ul07CiAgICAgICAgaW50IGlMID0gMCwgaVIgPSAwOwoKICAgICAgICBmb3IgKGRvdWJsZSB2IDogc2VnKSAKICAgICAgICB7IGlmICh2IDw9IGMpIGxlZnRbaUwrK10gPSB2OwogICAgICAgICAgICBlbHNlICAgICAgICByaWdodFtpUisrXSA9IHY7CiAgICAgICAgfQogCiAgICAgICAgLy8g0KDQtdC60YPRgNGB0LjRjyDQvdCwINC/0L7QtNC80LDRgdGB0LjQstCw0YUKICAgICAgICBsZWZ0ICA9IHNvcnREb3VibGVDb3B5KGxlZnQpOwogICAgICAgIHJpZ2h0ID0gc29ydERvdWJsZUNvcHkocmlnaHQpOwogCiAgICAgICAgLy8g0KHQutC70LXQudC60LAKICAgICAgICBkb3VibGVbXSBvdXQgPSBuZXcgZG91YmxlW25dOwogICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGVmdCwgIDAsIG91dCwgMCwgbGVmdC5sZW5ndGgpOwogICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmlnaHQsIDAsIG91dCwgbGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7CiAgICAgICAgcmV0dXJuIG91dDsKICAgIH0KIAogICAgLy8qKioqKioqKioqINCj0L3QuNCy0LXRgNGB0LDQu9GM0L3Ri9C5IHJhbmRvbSDQvNC10YLQvtC0CiAgICBwdWJsaWMgc3RhdGljIGRvdWJsZVtdIGdlbmVyYXRlRG91YmxlUmFuZG9tQXJyYXkoaW50IG4sIGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgpIAogICAgeyAgIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKCk7CiAgICAgICAgZG91YmxlW10gYXJyID0gbmV3IGRvdWJsZVtuXTsKIAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSAKICAgICAgICB7IGFycltpXSA9IG1pbiArIHJuZC5uZXh0RG91YmxlKCkgKiAobWF4IC0gbWluKTsgLy8gW21pbi4ubWF4KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgaW50W10gZ2VuZXJhdGVSYW5kb21BcnJheShpbnQgbiwgaW50IG1pbiwgaW50IG1heCkgCiAgICB7ICAgUmFuZG9tIHJuZCA9IG5ldyBSYW5kb20oKTsKICAgICAgICBpbnRbXSBhcnIgPSBuZXcgaW50W25dOwogCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIAogICAgICAgIHsgIGFycltpXSA9IHJuZC5uZXh0SW50KG1heCAtIG1pbiArIDEpICsgbWluOyAvLyBbbWluLi5tYXhdCiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnI7CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIAogICAgeyAgIGludFtdIHggPSB7NSwgMSwgOSwgMywgNywgMiwgMiwgOCwgNCwgNn07CiAgICAgICAgdGhhbm9zU29ydEluUGxhY2UoeCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEFycmF5cy50b1N0cmluZyh4KSk7CiAgICAgICAgCiAgICAgICAgaW50W10gYXJyID0gZ2VuZXJhdGVSYW5kb21BcnJheSgxNSwgLTEwMCwgMTAwKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFyciAgYmVmb3JlIDogIiArIEFycmF5cy50b1N0cmluZyhhcnIpKTsKICAgICAgICBpbnRbXSB0MSA9IGFyci5jbG9uZSgpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnQgTWFpbiBpbnQgdGVzdCBjb2RlIHdhdGNoLiIpOwogICAgICAgIGxvbmcgdDAgPSBTeXN0ZW0ubmFub1RpbWUoKTsKICAgICAgICB0aGFub3NTb3J0SW5QbGFjZSh0MSk7CiAgICAgICAgIGxvbmcgdDFuID0gU3lzdGVtLm5hbm9UaW1lKCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RvcCB3YXRjaC4iKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiVGhhbm9zIG1haW4gaW50IHRlc3QgY29kZSA6ICUuMmYgbXMlbiIsICh0MW4gLSB0MCkgLyAxZTYpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYXJyICBzb3J0ZWQgOiAiICsgQXJyYXlzLnRvU3RyaW5nKHQxKSk7CiAgICAgICAgCiAgICAgICAgZG91YmxlW10gYXJyRCA9IGdlbmVyYXRlRG91YmxlUmFuZG9tQXJyYXkoMTUsIC0xLCAxKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFyckQgYmVmb3JlIDogIiArIEFycmF5cy50b1N0cmluZyhhcnJEKSk7CiAgICAgICAgZG91YmxlW10gdDIgPSBhcnJELmNsb25lKCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdGFydCBEb3VibGUgdGVzdCBjb2RlIHdhdGNoLiIpOwogICAgICAgIGxvbmcgdDAyID0gU3lzdGVtLm5hbm9UaW1lKCk7CiAgICAgICAgdGhhbm9zRFNvcnRJblBsYWNlKHQyKTsKICAgICAgICBsb25nIHQybiA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0b3Agd2F0Y2guIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlRoYW5vcyBEb3VibGUgdGVzdCBjb2RlIDogJS4yZiBtcyVuIiwgKHQybiAtIHQwMikgLyAxZTYpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYXJyRCBzb3J0ZWQgOiAiICsgQXJyYXlzLnRvU3RyaW5nKHQyKSk7CiAgICB9Cn0K
[1, 2, 2, 3, 4, 5, 6, 7, 8, 9]
arr before : [93, 89, 6, 13, 74, -88, -11, 31, 74, -83, 95, -21, -53, 52, -20]
start Main int test code watch.
stop watch.
Thanos main int test code : 0.03 ms
arr sorted : [-88, -83, -53, -21, -20, -11, 6, 13, 31, 52, 74, 74, 89, 93, 95]
arrD before : [0.6800104072533404, 0.07291683325767684, 0.21628499708186855, -0.15596442837652402, -0.5165938189068717, -0.316702929056216, 0.20921295721284183, -0.6644994418387442, 0.5453002798606512, 0.0783697656815876, -0.7820284653553933, -0.6024217303397832, -0.923865478976482, -0.2960337952357992, -0.23349649685742202]
start Double test code watch.
stop watch.
Thanos Double test code : 0.05 ms
arrD sorted : [-0.923865478976482, -0.7820284653553933, -0.6644994418387442, -0.6024217303397832, -0.5165938189068717, -0.316702929056216, -0.2960337952357992, -0.23349649685742202, -0.15596442837652402, 0.07291683325767684, 0.0783697656815876, 0.20921295721284183, 0.21628499708186855, 0.5453002798606512, 0.6800104072533404]