模拟实现qsort()

🌸🌸🌸学了qsort()之后,让排序变得非常的简单。又经过深入学习发现,用之前学的冒泡排序能够模拟实现qsort().🌸🌸🌸

 🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

 自定义函数

排序

冒泡排序实现

 疑惑

为什么将base强制转化为(char*)呢?

结果


 自定义函数

首先模拟qsort(),自定义一个函数,是这个函数的参数qsort()保持一致

void buble_sort(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))

这里也需要传入 待排序数据的第一个元素的地址,排序元素的个数,一个元素有多少个字节,自定义比较函数。

排序

然后冒泡排序实现

void buble_sort(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))//这里的函数指针可以方便调用各种类型比较,不同类型的变量比较,可以调用不同类型的比较函数
{
    int i=0,j=0;
    //sz个元素就有sz-1趟
    for(i=0;i<sz-1;i++)
    {
        for(j=0;j<sz-1-i;i++)
        {
            //两个元素的比较
            //arr[j] arr[j+1]
            if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)
            {
                //交换
                swap((char*)base+j*width,(char*)base+(j+1)*width,width);//然后把这个变量的地址传给交换函数
            }
        }
    }
}

比较函数用的是整形变量的比较

int cmp_int(const void* e1,const void* e2)//对整形比较
{
    return *(int*)e1-*(int*)e2;
}

 疑惑

或许大家会疑惑这些代码?

if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)

为什么将base强制转化为(char*)呢?

假如比较的是整形变量,我们将base转化为(char*),加上width(就是这里的整形变量的大小,4字节)就可以找到下个元素的地址, 字符变量也一样,加上width(就是这里的字符变量的大小,1字节),其他变量也一样,这里是为了排序各种的类型变量,达到和qsort()一样的功能。

swap((char*)base+j*width,(char*)base+(j+1)*width,width)

 自定义的交换函数

void swap(char* buf1,char*buf2,int width)
{
    for(int i=0;i<width;i++)
    {
        char temp=*buf1;
        *buf1=*buf2;
        *buf2=temp;
        buf1++;
        buf2++;
    }
}

这里的交换函数交换的方法和以往的交换方法有些许不同,哪里不同呢?以前我们交换两个变量的值,只需要定义一个临时变量去实现,例如:int temp=0,a1=2,a2=3;我们交换只需要让a1=temp,a1=a2,a2=temp,这样a1和a2的值就交换了。但是这里的swap()函数的交换,不是交换的变量整个的值(这里是整形变量),也就是说不是一次性交换4个字节的内容,而是一个字节一个字节的交换。为什么这样做呢?这交换的是整形变量,万一我下次交换字符变量呢,所以我们一个字节一个字节的交换,保证能够交换其他类型变量的功能。

结果

这样我们就掌握了模拟实现qsort()的基本要点和难点,那让我们整体实践一下

#include<stdio.h>
void swap(char* buf1,char*buf2,int width)
//为什么不直接进行交换,而是交换每个字节的内容?这是因为这交换的不只是整形变量,这里还可以交换其它类型的变量

{
    for(int i=0;i<width;i++)
    {
        char temp=*buf1;
        *buf1=*buf2;
        *buf2=temp;
        buf1++;
        buf2++;
    }
}
void buble_sort(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))//这里的函数指针可以方便调用各种类型比较,不同类型的变量比较,可以调用不同类型的比较函数
{
    int i=0,j=0;
    //sz个元素就有sz-1趟
    for(i=0;i<sz-1;i++)
    {
        for(j=0;j<sz-1-i;i++)
        {
            //两个元素的比较
            //arr[j] arr[j+1]
            if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)//为什么将base强制转化为(char*)呢?假如比较的是整形变量,我们将base转化为(char*),加上width(就是这里的整形变量的大小,4字节)就可以找到下个元素的地址,
            {
                //交换
                swap((char*)base+j*width,(char*)base+(j+1)*width,width);//然后把这个变量的地址传给交换函数
            }
        }
    }
}
int cmp_int(const void* e1,const void* e2)//对整形比较
{
    return *(int*)e1-*(int*)e2;
}
int main()
{
    int arr[10]={2,3,4,5,6,7,1,9,13,10};
        int sz=sizeof(arr)/sizeof(arr[0]);
        buble_sort(arr,sz,sizeof(arr[0]),cmp_int);
        for(int i=0;i<sz;i++)
        {
            printf("%d ",arr[i]);
        }
    return 0;
}

运行结果

e9e7bb1cf1ef4f7d98cb7bd486000f97.jpeg

❤️ ❤️❤️模拟实现qsort()的内容大致就是这些了,如果大家有什么问题建议都可以发在评论区,我可以和大家一起探讨,共同学习,共同进步。🐶🐶🐶

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值