c语言堆排序的实现

堆排序的实现如下,用法与qsort相似:

static void swap(void* a, void* b, int size)
{
    char t;

    do {
        t = *(char*)a;
        *(char*)a++ = *(char*)b;
        *(char*)b++ = t;
    } while (--size > 0);
}
/* custom function cmp */
void sort(void* base, size_t num, size_t size, int (*cmp)(const void*, const void*))
{
    /* pre-scale counters for performance */
    int i = (num / 2 - 1) * size, n = num * size, c, r;

    /* heapify */
    for (; i >= 0; i -= size) {
        for (r = i; r * 2 + size < n; r = c) {
            c = r * 2 + size;
            if (c < n - size && cmp(base + c, base + c + size) < 0)
                c += size;
            if (cmp(base + r, base + c) >= 0)
                break;
            swap(base + r, base + c, size);
        }
    }

    /* sort */
    for (i = n - size; i > 0; i -= size) {
        swap(base, base + i, size);
        for (r = 0; r * 2 + size < i; r = c) {
            c = r * 2 + size;
            if (c < i - size && cmp(base + c, base + c + size) < 0)
                c += size;
            if (cmp(base + r, base + c) >= 0)
                break;
            swap(base + r, base + c, size);
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/tongyishu/p/12228256.html