• 实现bubble_sort冒泡排序函数,排序任意类型数据


    一、设计bubble_sort函数原型

    类比qsort函数原型:

    void qsort (void* base, size_t num, size_t size, int (*compar)(const void* e1,const void* e2))

    所以设计bubble_sort函数原型:

    void bubble_sort (void* base, size_t num, size_t size, int (*compar)(const void* e1,const void* e2))

    二、冒泡排序算法

    以下代码只能排序整型数组,要想排序任意类型数据还需改造

    1. void bubble_sort(int *arr, size_t size)
    2. {
    3. for (int i = 0; i < size - 1; i++)//冒泡次数为待排序元素个数-1
    4. {
    5. int flag = 0;
    6. for (int j = 0; j < size - 1 - i; j++)//每次比较的次数为剩余待排序元素个数-1
    7. {
    8. if (arr[j] > arr[j + 1])
    9. {
    10. flag = 1;
    11. int tmp = arr[j];
    12. arr[j] = arr[j + 1];
    13. arr[j + 1] = tmp;
    14. }
    15. }
    16. if (flag == 0)//提前排序完成,结束排序
    17. {
    18. break;
    19. }
    20. }
    21. }

    三、实现bubble_sort冒泡排序函数排序任意类型数据

    1. //交换函数,一个字节一个字节地交换
    2. void swap(char* buf1, char* buf2, size_t size)//用字符指针接收,这样解引用时就可以只取到一个字节
    3. {
    4. for (int i = 0; i < size; i++)//每次交换1个字节的内容,一共交换的次数为待排序元素的字节大小
    5. {
    6. char p = *buf1;
    7. *buf1 = *buf2;
    8. *buf2 = p;
    9. buf1++;
    10. buf2++;
    11. }
    12. }
    13. void bubble_sort(void* base, size_t num, size_t size, int(*compar)(const void* e1, const void* e2))
    14. {
    15. for (int i = 0; i < num - 1; i++)
    16. {
    17. int flag = 0;
    18. for (int j = 0; j < num - 1 - i; j++)
    19. {
    20. //if (arr[j] > arr[j + 1])
    21. //因为无法确定待排序元素的具体类型,但已知元素的字节大小,所以只能将其强制转换为char*,这样加减整数就只移动一个字节,根据元素字节大小可以找到元素起始地址
    22. if (compar((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
    23. {
    24. //交换(因为无法确定待排序元素的具体类型,所以需要一个字节一个字节地交换,已知待排序元素地字节大小)
    25. flag = 1;
    26. //int tmp = arr[j];
    27. //arr[j] = arr[j + 1];
    28. //arr[j + 1] = tmp;
    29. swap((char*)base + j * size, (char*)base + (j + 1) * size, size);//交换函数
    30. }
    31. }
    32. }
    33. }

     四、测试:排序整型数组,结构体数组

    1.排序整型数组

    1. int cmp_int(const void* e1, const void* e2)
    2. {
    3. return *(int*)e1 - *(int*)e2;
    4. }
    5. int main()
    6. {
    7. int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
    8. Print(arr, sizeof(arr) / sizeof(arr[0]));
    9. //bubble_sort(arr, sizeof(arr) / sizeof(arr[0]));
    10. bubble_sort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_int);
    11. Print(arr, sizeof(arr) / sizeof(arr[0]));
    12. return 0;
    13. }

    2.排序结构体数组——按姓名首字母排序

    1. struct stu {
    2. int age;
    3. char name[20];
    4. }s1,s2,s3;
    5. void Print(struct stu* arr, size_t num)
    6. {
    7. for (int i = 0; i < num; i++)
    8. {
    9. printf("%s ", arr[i].name);
    10. }
    11. printf("\n");
    12. }
    13. int cmp_struct_name(const void* e1, const void* e2)
    14. {
    15. return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
    16. }
    17. int main()
    18. {
    19. s1.age = 20; strcpy(s1.name, "Tom");
    20. s2.age = 30; strcpy(s2.name, "Jerry");
    21. s3.age = 40; strcpy(s3.name, "Allen");
    22. /*struct stu s1 = { 20,"Tom" };
    23. struct stu s2 = { 30,"Jerry" };
    24. struct stu s3 = { 40,"Allen" };*/
    25. struct stu arr[] = { s1,s2,s3 };
    26. Print(arr, sizeof(arr) / sizeof(arr[0]));
    27. bubble_sort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_struct_name);
    28. Print(arr, sizeof(arr) / sizeof(arr[0]));
    29. return 0;
    30. }

  • 相关阅读:
    外包干了8天,技术退步明显。。。。。
    手机照片备份方案Immich
    Leecode 链表
    【机器学习】朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)
    Hippy - 值得关注的免费开源跨端开发框架,由腾讯出品,支持将 JS 代码发布到安卓 / iOS / web
    第二十届北京消防展即将开启,汉威科技即将精彩亮相
    专业直播录屏软件推荐,让画面更清晰!
    运营商三网精准大数据实时截流之网站实时数据
    基于springboot实现课程答疑管理系统项目【项目源码+论文说明】计算机毕业设计
    Java skill - 指定服务打开两个端口的顺序
  • 原文地址:https://blog.csdn.net/2301_76197086/article/details/133696026