#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Qsort(void *base, int n, int size, int (*cmp)(const void *, const void *)) {
int min, max;
void *tmp, *idx;
if (n <= 1)
return;
if ((idx = malloc(size)) == NULL)
return;
if ((tmp = malloc(size)) == NULL) {
free(idx);
return;
}
memcpy(idx, base, size);
min = 1;
max = n - 1;
while (min <= max) {
if ((*cmp)(idx, base + min * size) < 0) {
memcpy(tmp, base + min * size, size);
memcpy(base + min * size, base + max * size, size);
memcpy(base + max * size, tmp, size);
max--;
} else {
memcpy(base + (min - 1) * size, base + min * size, size);
min++;
}
}
memcpy(base + max * size, idx, size);
if (min > 1) {
Qsort(base, min - 1, size, (int (*)(const void *, const void *))cmp);
}
if (max < n - 1) {
Qsort(base + (max + 1) * size, n - 1 - max, size, (int (*)(const void *, const void *))cmp);
}
free(tmp);
free(idx);
}
int cmp1(int *a, int *b) {
return (*a == *b) ? 0 : (*a > *b) ? 1 : -1;
}
int cmp2(int *a, int *b) {
return (*a == *b) ? 0 : (*a < *b) ? 1 : -1;
}
int main(void) {
int i;
int a[] = {3, 2, 4, 5, 6, 8, 7, 9, 1, 0 };
int b[sizeof(a) / sizeof(a[0])];
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
printf("%d ", a[i]);
putchar('\n');
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
b[i] = a[i];
Qsort(b, sizeof(b) / sizeof(b[0]), sizeof(b[0]), (int (*)(const void *, const void *))cmp1);
for (i = 0; i < sizeof(b) / sizeof(b[0]); i++)
printf("%d ", b[i]);
putchar('\n');
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
b[i] = a[i];
Qsort(b, sizeof(b) / sizeof(b[0]), sizeof(b[0]), (int (*)(const void *, const void *))cmp2);
for (i = 0; i < sizeof(b) / sizeof(b[0]); i++)
printf("%d ", b[i]);
putchar('\n');
return 0;
}
/* end */