Files
libucore/src/heapsort.c
T
2013-12-03 14:29:57 +01:00

54 lines
1.2 KiB
C

#include <string.h>
#include "ucore/heapsort.h"
static void
uc_sift(unsigned char *base, size_t start, size_t count, size_t width,
uc_hs_cmp cmp, uc_hs_swp swap, void *cookie)
{
size_t root = start, child;
while ((root * 2 + 1) < count) {
child = root * 2 + 1;
if (child < (count - 1)) {
int rc = cmp(&base[child * width], &base[(child + 1) * width], cookie);
if (rc < 0) {
child++;
}
}
if (cmp(&base[root * width], &base[child * width], cookie) < 0) {
swap(base + root * width, base + child * width);
root = child;
} else {
return;
}
}
}
void
uc_heapsort(void *base_, size_t count, size_t width,
uc_hs_cmp cmp, uc_hs_swp swap, void *cookie)
{
long start;
long end;
unsigned char *base = base_;
if (count == 0 || width == 0) {
return;
}
start = count / 2 - 1,
end = count - 1;
while (start >= 0) {
uc_sift(base, start, count, width, cmp, swap, cookie);
start--;
}
while (end > 0) {
swap(base + end * width, base);
uc_sift(base, 0, end, width, cmp, swap, cookie);
end--;
}
}