自己完成一个冒泡排序(bubble_sort),可以完成不同类型数据的排序

冒泡排序我们都知道,就是比较相邻的数字大小,将数组从小到大排序。(前面的博客写过这个排序),那要是用冒泡排序完成不同类型的数据的排序呢?
这一下子就让我想到了sqort,上一篇博客才写过这个函数,特别是这个函数的参数,其中最后一个参数就是一个函数指针,可以指向不同的函数。那么我们可不可以用冒泡排序模拟一下sqort函数呢?
答案是肯定的,我们可以根据不同类型的数据写几个比较函数,然后将函数地址传给冒泡排序的最后一个参数,其他的和sqort相似。
下面我们就来看看这是如何实行的吧!

//自己完成一个冒泡排序(bubble_sort),可以完成不同类型数据的排序。

int cmp_int(const void * a,const void * b)//整形比较函数
{
     return *(int *)a - *(int *)b;
}

int cmp_double(const void * a,const void * b)//浮点数比较函数
{
    return *(double*)a > *(double*)b ? 1 : -1;
}

int cmp_string(const void * a,const void * b)//字符串比较函数
{
     return strcmp((const char *)a,(const char *)b);
}

void bubbleSort(void *data, int nums, int width, int (*cmp)(void *, void*))
{
    int i=0;
    int j=0;
    int k=0;
    int count=0;
    const void* p1 = NULL;
    const void* p2 = NULL;
    char*start=(char*)data;
    for(i=0;i<nums-1;i++)
    {
        for(j=0;j<nums-1-i;j++)
        {
            p1 = (const void*)(start + j* width);
            p2 = (const void*)(start + (j + 1)* width);
            if(cmp(p1,p2)>0)
            {
                for(k = 0; k < width; ++k)
                {
                    start[j* width+k] = start[j*width+k]+start[(j+1)*width+k];
                    start[(j+1)*width+k] = start[j*width+k]-start[(j+1)*width+k];
                    start[j* width+k] = start[j*width+k]-start[(j+1)*width+k];
                }
                count=1;
            }
        }
        if(!count)
            break;
    }
}

int main()
{
    int i=0;
    int num[]={12,32,65,54,12,15,658,5621,34,0};
    double dou[]={12.3,32.36,65.548,54.210,12.125,15.478,658.1,5621.2,34.3,0.456};
    char *str[]={"enter","number","size","begin","of","cat","case","program","certain","a"};
    bubbleSort(num, 10, sizeof(int), cmp_int);
    bubbleSort(dou, 10, sizeof(double), cmp_double);
    bubbleSort(str, 10, sizeof(char*), cmp_string);
    for(i=0;i<10;i++)
    {
        printf("%d ",num[i]);

    }
    printf("\n");
    for(i=0;i<10;i++)
    {
        printf("%lf ",dou[i]);
        if(i==4)
        {
            printf("\n");
        }

    }
    printf("\n");
    for(i=0;i<10;i++)
    {
        printf("%s ",str[i]);

    }
    printf("\n");
    system("pause");
    return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值