#include <stdio.h>
#include <string.h>
typedef int (*comparator_t)(void*, void*);
void bubble_sort(void *items, size_t size, size_t count, comparator_t compare) {
int i, j;
char temp[size];
for(i = 0; i < count - 1; ++i) {
for(j = i + 1; j < count; ++j) {
if (compare(items + (i * size), items + (j * size)) == 1) {
memcpy(temp
, items
+ (i
* size
), size
); memcpy(items
+ i
* size
, items
+ (j
* size
), size
); memcpy(items
+ (j
* size
), temp
, size
); }
}
}
}
int compare_long(void* p_a, void* p_b) {
long a = *(long*)p_a;
long b = *(long*)p_b;
if(a < b) return -1;
if(a > b) return 1;
return 0;
}
int main(int argc, char *argv[]) {
long x[] = { 5, 6, 1, 2, 9 };
int i;
for (i
= 0; i
< 5; ++i
) printf("%ld ", x
[i
]);
bubble_sort(x, sizeof(long), 5, compare_long);
for (i
= 0; i
< 5; ++i
) printf("%ld ", x
[i
]); }
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnR5cGVkZWYgaW50ICgqY29tcGFyYXRvcl90KSh2b2lkKiwgdm9pZCopOwoKdm9pZCBidWJibGVfc29ydCh2b2lkICppdGVtcywgc2l6ZV90IHNpemUsIHNpemVfdCBjb3VudCwgY29tcGFyYXRvcl90IGNvbXBhcmUpIHsKICAgIGludCBpLCBqOwogICAgY2hhciB0ZW1wW3NpemVdOwogICAgZm9yKGkgPSAwOyBpIDwgY291bnQgLSAxOyArK2kpIHsKICAgICAgICBmb3IoaiA9IGkgKyAxOyBqIDwgY291bnQ7ICsraikgewogICAgICAgICAgICBpZiAoY29tcGFyZShpdGVtcyArIChpICogc2l6ZSksIGl0ZW1zICsgKGogKiBzaXplKSkgPT0gMSkgewogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAsIGl0ZW1zICsgKGkgKiBzaXplKSwgc2l6ZSk7CiAgICAgICAgICAgICAgICBtZW1jcHkoaXRlbXMgKyBpICogc2l6ZSwgaXRlbXMgKyAoaiAqIHNpemUpLCBzaXplKTsKICAgICAgICAgICAgICAgIG1lbWNweShpdGVtcyArIChqICogc2l6ZSksIHRlbXAsIHNpemUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgppbnQgY29tcGFyZV9sb25nKHZvaWQqIHBfYSwgdm9pZCogcF9iKSB7CiAgICBsb25nIGEgPSAqKGxvbmcqKXBfYTsKICAgIGxvbmcgYiA9ICoobG9uZyopcF9iOwoKICAgIGlmKGEgPCBiKSByZXR1cm4gLTE7CiAgICBpZihhID4gYikgcmV0dXJuIDE7CiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgbG9uZyB4W10gPSB7IDUsIDYsIDEsIDIsIDkgfTsKICAgIGludCBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHByaW50ZigiJWxkICIsIHhbaV0pOwogICAgcHJpbnRmKCJcbiIpOwogICAgCiAgICBidWJibGVfc29ydCh4LCBzaXplb2YobG9uZyksIDUsIGNvbXBhcmVfbG9uZyk7CgogICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgcHJpbnRmKCIlbGQgIiwgeFtpXSk7Cn0=