C语言通过冒泡排序模拟实现库函数qsort

库函数qsort通过快速排序可以实现对整形,字符型,结构体类型的排序。

我们也可以通过冒泡模拟实现这一函数的功能:

  1. 分析库函数qsort的调用:qsort(void* base, size_t num, size_t width, int (*cmp)(const void* buf1, const void* buf2)) 函数内部使用的是void*类型的指针,并需要你个cmp函数这里使用回调函数的方式进行调用。

  1. 下面是函数的实现:

void Swap(char* base1, char* base2,size_t width)
{
    int i = 0;
    for (i = 0; i < width; i++)
    {
        //将base1和base2地址的每个字节都交换
        char tmp = *base1;
        *base1 = *base2;
        *base2 = tmp;
        base1++;//base1指向下一位置
        base2++;//base2指向下一位置
    }
}
void bubble_qsort(void* base, size_t num, size_t width, int (*cmp)(const void* buf1, const void* buf2))
{
    size_t i;
    size_t j;
    size_t flag = 0;
    for (i = 0; i < num - 1; i++)
    {
        //一趟冒泡排序
        for (j = 0; j < num - i - 1; j++)
        {
            if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
            {
                //条件满足进行交换
                Swap((char*)base+j*width, (char*)base + (j + 1) * width,width);
                flag = 1;
            }
        }
        //进行一趟冒泡排序没有要交换的元素说明已经按升序排列此时可以跳出循环
        if (flag == 0)
            break;
    }
}

注意:因为要实现对整形,字符型等的排序故我们在函数内部使用强制类型转化将void*转化为char*类型以满足这一要求

3.函数的拓展:将cmp函数加以改动或将“cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0“改为”cmp((char*)base + j * width, (char*)base + (j + 1) * width) < 0“即可实现降序排列。

本人为C语言初学者代码如果有改进的地方忘大佬指导

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值