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

来源:互联网 发布:淘宝多久不能追加评论 编辑:程序博客网 时间:2024/06/04 19:04

浏览顺序:
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);}

这里写图片描述

0 0