0
点赞
收藏
分享

微信扫一扫

写一个简单的qsort和bsearch

E_topia 2022-02-05 阅读 46
void Qsort(void *base, int len, int size, int (*cmp)(const void *, const void *))
{
    for (int i = 0; i < len - 1; i++)
    {
        int minid = i;
        for (int j = i + 1; j < len; j++)
            if (cmp(base + minid * size, base + j * size) > 0)
                minid = j;
        char buf[size];
        memcpy(buf, base + minid * size, size);
        memcpy(base + minid * size, base + i * size, size);
        memcpy(base + i * size, buf, size);
    }
}

void *Bsearch(void *key, void *base, int len, int size, int (*cmp)(const void *, const void *))
{
    void *lt = base;
    void *rt = base + (len - 1) * size;
    while (lt <= rt)
    {
        void *mid = lt + (rt - lt) / size / 2 * size;
        if (cmp(mid, key) == 0)
            return mid;
        if (cmp(mid, key) < 0)
            lt = mid + size;
        else
            rt = mid - size;
    }
    return NULL;
}

当然,如果在qsort中不想使用string.h中的memcpy()函数,也可以把qsort()改写成以下样子。

void Qsort(void *base, int len, int size, int (*cmp)(const void *, const void *))
{
    for (int i = 0; i < len - 1; i++)
    {
        int minid = i;
        for (int j = i + 1; j < len; j++)
            if (cmp(base + minid * size, base + j * size) > 0)
                minid = j;
        char temp;
        for (int k = 0; k < size; k++)
        {
            temp = *(char *)(base + minid * size);
            *(char *)(base + minid * size) = *(char *)(base + i * size);
            *(char *)(base + i * size) = temp;
        }
    }
}
举报

相关推荐

0 条评论