#include <stdio.h>
void Qsort(
void* sup,
int n,
int size,
int(*cmp) (const void *x, const void *y),
void (*swap) (void *a,void *b))
{
int pv = n / 2, l = 0, h = n - 1;
if (n < 2)
return;
while (h - 1 >= l)
{
if (l == pv)
{
swap((char*)sup + pv * size, (char*)sup + (pv + 1) * size);
pv++;
}
if(h == pv)
{
swap((char*)sup + pv * size, (char*)sup + (pv - 1) * size);
pv--;
}
if (cmp((char*)sup + h * size, (char*)sup + pv * size) > 0)
{
h--;
continue;
}
if (cmp((char*)sup + pv * size, (char*)sup + l * size) > 0)
{
l++;
continue;
}
swap((char*)sup + l * size, (char*)sup + h * size);
l++, h--;
}
Qsort(sup, l, size, cmp, swap);
Qsort((char*)sup + l * size, n - l, size, cmp, swap);
}
int cmp(const void *c1, const void *c2)
{
int a = *(const int*)c1;
int b = *(const int*)c2;
if (a > b) return 1;
if (a < b) return -1;
return 0;
}
void swap(void *c1, void *c2)
{
int c = *(int*)c1;
*(int*)c1 = *(int*)c2;
*(int*)c2 = c;
}
void print(int* arr, int size)
{
int i = 0;
for(; i < size; ++i)
{
}
}
int main(void)
{
int arr[4] = {3,4,1,2};
print(arr, 4);
Qsort(arr, 4, sizeof(arr[0]), &cmp, &swap);
print(arr, 4);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp2b2lkIFFzb3J0KAogIHZvaWQqIHN1cCwKICBpbnQgbiwKICBpbnQgc2l6ZSwKICBpbnQoKmNtcCkgKGNvbnN0IHZvaWQgKngsIGNvbnN0IHZvaWQgKnkpLAogIHZvaWQgKCpzd2FwKSAodm9pZCAqYSx2b2lkICpiKSkKewogIGludCBwdiA9IG4gLyAyLCBsID0gMCwgaCA9IG4gLSAxOwoKICBpZiAobiA8IDIpCiAgICByZXR1cm47CgogIHdoaWxlIChoIC0gMSA+PSBsKQogIHsKICAgIGlmIChsID09IHB2KQogICAgewogICAgICBzd2FwKChjaGFyKilzdXAgKyBwdiAqIHNpemUsIChjaGFyKilzdXAgKyAocHYgKyAxKSAqIHNpemUpOwogICAgICBwdisrOwogICAgfQoKICAgIGlmKGggPT0gcHYpCiAgICB7CiAgICAgIHN3YXAoKGNoYXIqKXN1cCArIHB2ICogc2l6ZSwgKGNoYXIqKXN1cCArIChwdiAtIDEpICogc2l6ZSk7CiAgICAgIHB2LS07CiAgICB9CgogICAgaWYgKGNtcCgoY2hhciopc3VwICsgaCAqIHNpemUsIChjaGFyKilzdXAgKyBwdiAqIHNpemUpID4gMCkKICAgIHsKICAgICAgaC0tOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoY21wKChjaGFyKilzdXAgKyBwdiAqIHNpemUsIChjaGFyKilzdXAgKyBsICogc2l6ZSkgPiAwKQogICAgewogICAgICBsKys7CiAgICAgIGNvbnRpbnVlOwogICAgfQogCiAgICBzd2FwKChjaGFyKilzdXAgKyBsICogc2l6ZSwgKGNoYXIqKXN1cCArIGggKiBzaXplKTsKICAgIGwrKywgaC0tOwogIH0KCiAgUXNvcnQoc3VwLCBsLCBzaXplLCBjbXAsIHN3YXApOwogIFFzb3J0KChjaGFyKilzdXAgKyBsICogc2l6ZSwgbiAtIGwsIHNpemUsIGNtcCwgc3dhcCk7Cn0KCmludCBjbXAoY29uc3Qgdm9pZCAqYzEsIGNvbnN0IHZvaWQgKmMyKQp7CiAgaW50IGEgPSAqKGNvbnN0IGludCopYzE7CiAgaW50IGIgPSAqKGNvbnN0IGludCopYzI7CiAgaWYgKGEgPiBiKSByZXR1cm4gMTsKICBpZiAoYSA8IGIpIHJldHVybiAtMTsKICByZXR1cm4gMDsKfQoKdm9pZCBzd2FwKHZvaWQgKmMxLCB2b2lkICpjMikKewogIGludCBjID0gKihpbnQqKWMxOwogICooaW50KiljMSA9ICooaW50KiljMjsKICAqKGludCopYzIgPSBjOwp9Cgp2b2lkIHByaW50KGludCogYXJyLCBpbnQgc2l6ZSkKewogIGludCBpID0gMDsKICBmb3IoOyBpIDwgc2l6ZTsgKytpKQogIHsKICAgIHByaW50ZigiJWQgXHQiLCBhcnJbaV0pOwogIH0KfQoKaW50IG1haW4odm9pZCkKewogIGludCBhcnJbNF0gPSB7Myw0LDEsMn07CiAgcHJpbnQoYXJyLCA0KTsKICBwcmludGYoIlxuXG4iKTsKICBRc29ydChhcnIsIDQsIHNpemVvZihhcnJbMF0pLCAmY21wLCAmc3dhcCk7CiAgcHJpbnQoYXJyLCA0KTsKICByZXR1cm4gMDsKfQo=