import java.util.concurrent.TimeUnit;
public class Main {
static long last = 42;
static final long a = 25214903917L; // Multiplier
static final long c = 11; // Increment
static final long m = 1L << 48; // Modulus
static int nextInt(int bound) {
last = (a * last + c) % m;
return (int) (last % bound);
}
// Quick Sort
static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// pi is partitioning index, arr[pi] is now at right place
int pi = partition(arr, low, high);
// Recursively sort elements before partition and after partition
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
// A utility function to swap two elements
static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/* This function takes last element as pivot, places the pivot element at its correct position in sorted array,
and places all smaller (smaller than pivot) to left of pivot and all greater elements to right of pivot */
static int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = (low - 1); // index of smaller element
for (int j = low; j < high; j++) {
// If current element is smaller than the pivot
if (arr[j] < pivot) {
i++;
// swap arr[i] and arr[j]
swap(arr, i, j);
}
}
// swap arr[i+1] and arr[high] (or pivot)
swap(arr, i + 1, high);
return i + 1;
}
public static void main
(String[] args
) { final int N = 100;
int[] arr = new int[N];
final int M = 50;
long[] sortingTimes = new long[M];
long start
= System.
nanoTime();
// Save initial value of last
long initialLast = last;
for (int i = 1; i <= M; i++) {
// Restore initial value of last
last = initialLast;
for (int j = 0; j < N; j++) {
arr[j] = nextInt(1007);
}
long sortStart
= System.
nanoTime();
// Sorting algorithm
quickSort(arr, 0, arr.length - 1);
long sortStop
= System.
nanoTime(); long sortDuration = sortStop - sortStart;
// Add value of time in array in nanoseconds
sortingTimes[i - 1] = sortDuration;
}
// Average time in nanoseconds
long averageTime = 0;
for (int i = 0; i < M; i++) {
averageTime += sortingTimes[i];
}
System.
out.
println("Average Time: " + (double) averageTime
/ M
+ " nanoseconds"); }
}
aW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwoKcHVibGljIGNsYXNzIE1haW4gewogICAgc3RhdGljIGxvbmcgbGFzdCA9IDQyOwogICAgc3RhdGljIGZpbmFsIGxvbmcgYSA9IDI1MjE0OTAzOTE3TDsgLy8gTXVsdGlwbGllcgogICAgc3RhdGljIGZpbmFsIGxvbmcgYyA9IDExOyAvLyBJbmNyZW1lbnQKICAgIHN0YXRpYyBmaW5hbCBsb25nIG0gPSAxTCA8PCA0ODsgLy8gTW9kdWx1cwoKICAgIHN0YXRpYyBpbnQgbmV4dEludChpbnQgYm91bmQpIHsKICAgICAgICBsYXN0ID0gKGEgKiBsYXN0ICsgYykgJSBtOwogICAgICAgIHJldHVybiAoaW50KSAobGFzdCAlIGJvdW5kKTsKICAgIH0KCiAgICAvLyBRdWljayBTb3J0CiAgICBzdGF0aWMgdm9pZCBxdWlja1NvcnQoaW50W10gYXJyLCBpbnQgbG93LCBpbnQgaGlnaCkgewogICAgICAgIGlmIChsb3cgPCBoaWdoKSB7CiAgICAgICAgICAgIC8vIHBpIGlzIHBhcnRpdGlvbmluZyBpbmRleCwgYXJyW3BpXSBpcyBub3cgYXQgcmlnaHQgcGxhY2UKICAgICAgICAgICAgaW50IHBpID0gcGFydGl0aW9uKGFyciwgbG93LCBoaWdoKTsKCiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNvcnQgZWxlbWVudHMgYmVmb3JlIHBhcnRpdGlvbiBhbmQgYWZ0ZXIgcGFydGl0aW9uCiAgICAgICAgICAgIHF1aWNrU29ydChhcnIsIGxvdywgcGkgLSAxKTsKICAgICAgICAgICAgcXVpY2tTb3J0KGFyciwgcGkgKyAxLCBoaWdoKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gQSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHN3YXAgdHdvIGVsZW1lbnRzCiAgICBzdGF0aWMgdm9pZCBzd2FwKGludFtdIGFyciwgaW50IGksIGludCBqKSB7CiAgICAgICAgaW50IHRlbXAgPSBhcnJbaV07CiAgICAgICAgYXJyW2ldID0gYXJyW2pdOwogICAgICAgIGFycltqXSA9IHRlbXA7CiAgICB9CgogICAgLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBsYXN0IGVsZW1lbnQgYXMgcGl2b3QsIHBsYWNlcyB0aGUgcGl2b3QgZWxlbWVudCBhdCBpdHMgY29ycmVjdCBwb3NpdGlvbiBpbiBzb3J0ZWQgYXJyYXksCiAgICBhbmQgcGxhY2VzIGFsbCBzbWFsbGVyIChzbWFsbGVyIHRoYW4gcGl2b3QpIHRvIGxlZnQgb2YgcGl2b3QgYW5kIGFsbCBncmVhdGVyIGVsZW1lbnRzIHRvIHJpZ2h0IG9mIHBpdm90ICovCiAgICBzdGF0aWMgaW50IHBhcnRpdGlvbihpbnRbXSBhcnIsIGludCBsb3csIGludCBoaWdoKSB7CiAgICAgICAgaW50IHBpdm90ID0gYXJyW2hpZ2hdOwogICAgICAgIGludCBpID0gKGxvdyAtIDEpOyAvLyBpbmRleCBvZiBzbWFsbGVyIGVsZW1lbnQKICAgICAgICBmb3IgKGludCBqID0gbG93OyBqIDwgaGlnaDsgaisrKSB7CiAgICAgICAgICAgIC8vIElmIGN1cnJlbnQgZWxlbWVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIHBpdm90CiAgICAgICAgICAgIGlmIChhcnJbal0gPCBwaXZvdCkgewogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgLy8gc3dhcCBhcnJbaV0gYW5kIGFycltqXQogICAgICAgICAgICAgICAgc3dhcChhcnIsIGksIGopOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHN3YXAgYXJyW2krMV0gYW5kIGFycltoaWdoXSAob3IgcGl2b3QpCiAgICAgICAgc3dhcChhcnIsIGkgKyAxLCBoaWdoKTsKICAgICAgICByZXR1cm4gaSArIDE7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIGZpbmFsIGludCBOID0gMTAwOwogICAgICAgIGludFtdIGFyciA9IG5ldyBpbnRbTl07CgogICAgICAgIGZpbmFsIGludCBNID0gNTA7CiAgICAgICAgbG9uZ1tdIHNvcnRpbmdUaW1lcyA9IG5ldyBsb25nW01dOwoKICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CgogICAgICAgIC8vIFNhdmUgaW5pdGlhbCB2YWx1ZSBvZiBsYXN0CiAgICAgICAgbG9uZyBpbml0aWFsTGFzdCA9IGxhc3Q7CgogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE07IGkrKykgewogICAgICAgICAgICAvLyBSZXN0b3JlIGluaXRpYWwgdmFsdWUgb2YgbGFzdAogICAgICAgICAgICBsYXN0ID0gaW5pdGlhbExhc3Q7CgogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICAgICAgYXJyW2pdID0gbmV4dEludCgxMDA3KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9uZyBzb3J0U3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKCiAgICAgICAgICAgIC8vIFNvcnRpbmcgYWxnb3JpdGhtCiAgICAgICAgICAgIHF1aWNrU29ydChhcnIsIDAsIGFyci5sZW5ndGggLSAxKTsKCiAgICAgICAgICAgIGxvbmcgc29ydFN0b3AgPSBTeXN0ZW0ubmFub1RpbWUoKTsKICAgICAgICAgICAgbG9uZyBzb3J0RHVyYXRpb24gPSBzb3J0U3RvcCAtIHNvcnRTdGFydDsKCiAgICAgICAgICAgIC8vIEFkZCB2YWx1ZSBvZiB0aW1lIGluIGFycmF5IGluIG5hbm9zZWNvbmRzCiAgICAgICAgICAgIHNvcnRpbmdUaW1lc1tpIC0gMV0gPSBzb3J0RHVyYXRpb247CiAgICAgICAgfQoKICAgICAgICAvLyBBdmVyYWdlIHRpbWUgaW4gbmFub3NlY29uZHMKICAgICAgICBsb25nIGF2ZXJhZ2VUaW1lID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgewogICAgICAgICAgICBhdmVyYWdlVGltZSArPSBzb3J0aW5nVGltZXNbaV07CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXZlcmFnZSBUaW1lOiAiICsgKGRvdWJsZSkgYXZlcmFnZVRpbWUgLyBNICsgIiBuYW5vc2Vjb25kcyIpOwogICAgfQp9