#include #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--; } }