#include <stdio.h>
#include <stdlib.h>
void quicksort(double *A, int len);
int main (void) {
int n = 10000000;
double *a = (double*)malloc(n * sizeof (double));
int i;
for (i = 0; i < n; i++) {
a[i] = rand();
}
/*
double a[] = {4, 65, 2, -31, 0, 99, 2, 83, 782, 1};
int n = sizeof a / sizeof a[0];
int i;
for (i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
*/
quicksort(a, n);
/*
for (i = 0; i < n; i++) {
printf("%f ", a[i]);
}
printf("\n");
*/
return 0;
}
void quicksort(double *A, int len) {
if (len < 2) return;
int pivot = A[len / 2];
int i, j;
for (i = 0, j = len - 1; ; i++, j--) {
while (A[i] < pivot) i++;
while (A[j] > pivot) j--;
if (i >= j) break;
double temp = A[i];
A[i] = A[j];
A[j] = temp;
}
quicksort(A, i);
quicksort(A + i, len - i);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnZvaWQgcXVpY2tzb3J0KGRvdWJsZSAqQSwgaW50IGxlbik7CiAKaW50IG1haW4gKHZvaWQpIHsKICBpbnQgbiA9IDEwMDAwMDAwOwogIGRvdWJsZSAqYSA9IChkb3VibGUqKW1hbGxvYyhuICogc2l6ZW9mIChkb3VibGUpKTsKCiAgaW50IGk7CiAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgYVtpXSA9IHJhbmQoKTsKICB9CiAgCi8qIAogIGRvdWJsZSBhW10gPSB7NCwgNjUsIDIsIC0zMSwgMCwgOTksIDIsIDgzLCA3ODIsIDF9OwogIGludCBuID0gc2l6ZW9mIGEgLyBzaXplb2YgYVswXTsKICBpbnQgaTsKICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICBwcmludGYoIiVkICIsIGFbaV0pOwogIH0KICBwcmludGYoIlxuIik7CiAqLwogIHF1aWNrc29ydChhLCBuKTsKIC8qCiAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgcHJpbnRmKCIlZiAiLCBhW2ldKTsKICB9CiAgcHJpbnRmKCJcbiIpOwogKi8KICByZXR1cm4gMDsKfQogCnZvaWQgcXVpY2tzb3J0KGRvdWJsZSAqQSwgaW50IGxlbikgewogIGlmIChsZW4gPCAyKSByZXR1cm47CiAKICBpbnQgcGl2b3QgPSBBW2xlbiAvIDJdOwogCiAgaW50IGksIGo7CiAgZm9yIChpID0gMCwgaiA9IGxlbiAtIDE7IDsgaSsrLCBqLS0pIHsKICAgIHdoaWxlIChBW2ldIDwgcGl2b3QpIGkrKzsKICAgIHdoaWxlIChBW2pdID4gcGl2b3QpIGotLTsKIAogICAgaWYgKGkgPj0gaikgYnJlYWs7CiAKICAgIGRvdWJsZSB0ZW1wID0gQVtpXTsKICAgIEFbaV0gICAgID0gQVtqXTsKICAgIEFbal0gICAgID0gdGVtcDsKICB9CiAKICBxdWlja3NvcnQoQSwgaSk7CiAgcXVpY2tzb3J0KEEgKyBpLCBsZW4gLSBpKTsKfQog