实现一个bubble_sort函数,可以完成int ,float,char,string类型的排序

浏览顺序:
main()函数->被调用函数。
关键函数只有十几行,细心浏览,祝君成功!

#include<stdio.h>
#include<string.h>
#include<assert.h>

//在这里我们先演示int和字符串两中类型的冒泡排序
void bubble_sort(void*data, int nums, int width, int(*cmp)(void*, void*));
int int_cmp(void*num1, void*num2);
int str_cmp(const void*num1, const void *num2);


int main()
{
    int  arr1[] = { 15, 1, 56, 6, 8, 6, 7, 5, 63, 5, 6 };
    int arr2[] = { 'a', 'd', 'r,', 'm', 'g', 't', 'e', 'v', 'h', 'g', 'f', 'w', 'e', 'h' };
    double arr3[] = { 1.2, 1.3, 2.3, 5.6, 1.0, 2.6, 7.8 };   
    /*定义字符指针数组arr4,即定义一个数组,数组的每个元素为一个指针,
    该指针指向不同的字符串(指向一个个元素个数可以不同的字符数组,也就是指向不同的字符串)
    */
    char *arr4[] = { "aaa", "cccc", "bbbbb" };

    /*以上均为数组,求元素个数,求解类型一致*/
    int sz1 = sizeof(arr1) / sizeof(arr1[0]);
    int sz2 = sizeof(arr2) / sizeof(arr2[0]);
    int sz3 = sizeof(arr3) / sizeof(arr3[0]);
    int sz4 = sizeof(arr4) / sizeof(arr4[0]);

    //打印排序前
    for (int i = 0; i < sz1; i++)
    {
        printf("%d ", arr1[i]);
    }
    printf("\n");

    //此处:bubble_sort函数第4个参数为函数指针,传参时,将相应类型的比较函数的地址赋给函数指针,进行函数调用
    bubble_sort(arr1, sz1, sizeof(int), int_cmp);
    //打印排序后
    for (int i = 0; i < sz1; i++)
    {
        printf("%d ", arr1[i]);
    }
    printf("\n");

    for (int i = 0; i < sz4; i++)
    {
        puts(arr4[i]);
    }
    printf("\n");

    bubble_sort(arr4, sz4, sizeof(char*), str_cmp);

    for (int i = 0; i < sz4; i++)
    {
        puts(arr4[i]);
    }
    printf("\n");

    getchar();
    return 0;
}

//
void bubble_sort(void*data, int nums, int width, int(*cmp)(void*, void*))
{
    assert(data);
    int i;
    int j;
    for (i = 0; i < nums - 1; i++)
    {
        int flag = 0;
        char *start = (char*)data;//之所以可以排序任意类型,是因为进行交换一个不同数组元素时,全部转化为最小的char类型(*(char*)start)
        for (j = 0; j < nums - i - 1; j++)
        {
            if (cmp(start, start + width)<0)
            {
                //按照元素类型以最小类型char进行交换 
                for (int k = 0; k < width; k++)
                {

                    start[k] ^= start[k + width];
                    start[k + width] ^= start[k];
                    start[k] ^= start[k + width];
                }
                flag = 1;
            }
            start += width;
        }
        //添加flag,是为优化处理。当冒一次泡时,若没有发生交换,则直接跳出循环
        if (!flag)
        {
            break;
        }
    }

}

int int_cmp(void*num1, void*num2)
{
    return *(int *)num1 - *(int *)num2;
}

int float_cmp(const void*num1, const void*num2)
{
    float ret = *(float*)num1 - *(float*)num2;
    if (ret == 0)
    {
        return 0;
    }
    else if (ret < 0)
    {
        return -1;
    }
    else
    {
        return 1;
    }
}

//字符比较函数
int char_cmp(const void *num1, const void*num2)
{
    return *(char *)num1 - *(char *)num2;
}

//字符串比较函数
int str_cmp(const void*num1, const void *num2)
{
    return strcmp(*(char**)num1, *(char **)num2);
}


这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值