基于qsort库学习后在冒泡排序中自定义函数实现

#define _CRT_SECURE_NO_WARNINGS


#include<stdio.h>


int tmp_int(const void* e1, const void* e2)
//接收指针变量,再解引用
{
    int ret = *(int*)e1 - *(int*)e2;
    return ret;//e1,e2是一个void类型的指针,要强制类型转换为int指针,最后*解引用
}
void Swap(char* buff1,char* buff2, int width)
{
    int i = 0;
    //这里交换的是字节,如,一个整形4个字节,也就是width,将每个字节交换即可。
    for (i = 0; i < width; i++)
    {
        char tmp = 0;
        tmp = *buff1;
        *buff1 = *buff2;
        *buff2 = tmp;
        buff1++;
        buff2++;

    }
}
void Bubble_sort(void* base,int sz,int width,int(*tmp_int)(const void* e1, const void* e2))
//传参时不知道排序类型,所以base反应初始时元素首地址,然后是元素个数,每个元素的宽度,最后传入函数指针
//int(*tmp_int)(const void* e1, const void* e2)翻译:tmp_int为类型为参数是const void* e1, const void* e2返回类型为int的指针变量,函数名为tmp_int
{
    int i = 0;
    for (i = 0; i < sz - 1; i++)//只需要从第一个元素开始交换sz-1轮(一轮包含所有元素)
    {
        int j = 0;
        int flag = 1;//建立一个flag防止本就是排好序的情况下重复运行
        for (j = 0; j < sz - 1 - i; j++)
        {
            if (tmp_int((char*)base+j*width,(char*)base+(j+1)*width)>0)
                //回调比较函数,采用用函数指针找到函数并传参的方式,应不知比较的元素类型所以用最小的char类型+元素宽度就行了,注意这里传的是指针
            {
                //交换
                Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
                //注意传入元素宽度
                flag = 0;
            }
        }
        if (flag == 1)
        {
            break;
        }
    }
}
int main()
{
    int arr[10] = { 2,3,5,1,4,7,8,6,9,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    Bubble_sort(arr, sz,sizeof(arr[0]),tmp_int);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值