模仿qsort的功能实现一个通用的冒泡排序

简介: 一个通用的冒泡排序:则需要既能够排结构体也能够排int,也能够排double类型的数组;因此要用void*来接受数组地址。void*: 无具体类型的指针------------------其里面可以放任何类型的指针

一个通用的冒泡排序:则需要既能够排结构体也能够排int,也能够排double类型的数组;因此要用void*来接受数组地址。


void*: 无具体类型的指针------------------其里面可以放任何类型的指针


缺点:void指针无法运算。void指针无法进行+1操作,无法加减整数,无法解引用,并且base[i]等价于base+1,因此如果base是void*类型的话也就不能使用。


例如:

  int a = 10;
  float f = 5.5f;
  void* m1 = &a;
  void* m2 = &f;

主要是模仿qsort函数自己写一个bubbleSort函数:


这里是博主曾经写过的关于qsort函数的作用哦~


核心代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
/*
模仿qsort的功能实现一个通用的冒泡排序
*/
void Swap(char* buf1, char* buf2, int width)//一次交换一对字节
{
  int i = 0;
  for (i = 0; i < width; i++)
  {
    char temp = *buf1;
    *buf1 = *buf2;
    *buf2 = temp;
    buf1++;
    buf2++;
  }
}
int cmp_int(const void* e1, const void* e2)
{
  return *(int*)e1 - *(int*)e2;
}
void bubbleSort(void* base, size_t num, size_t width, int (*cmp)(const void*, const void*))//使用回调函数实现通用的冒泡排序函数
{
  int i = 0;
  for (i = 0; i < num - 1; i++)
  {
    int j = 0;
    for (j = 0; j < num - 1 - i; j++)
    {
      if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)//base[j]==base+j,因此在void*类型中都是不能用的
      {
        Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
      }
    }
  }
}
void print_arr(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
}
void test1()
{
  int arr[] = { 9,8,7,6,5,4,3,2,1 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  qsort(arr, sz, sizeof(arr[0]), cmp_int);
}
struct Stu
{
  char name[20];
  int age;
};
int cmp_name(const void* e1, const void* e2)
{
  return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
int cmp_age(const void* e1, const void* e2)
{
  return (((struct Stu*)e1)->age, ((struct Stu*)e2)->age);//要把e1,e2的void*类型改成struct Stu类型,因为void*无法比较
}
void test2()
{
  struct Stu s[3] = { {"zhangsan",15},{"lisi",17},{"wangwu",20} };
  int sz = sizeof(s) / sizeof(s[0]);
  //qsort(s, sz, sizeof(s[0]), cmp_name);//按照名字排序
  qsort(s, sz, sizeof(s[0]), cmp_age);//按照年龄来排序
}
void test3()
{
  int arr[] = { 9,8,7,6,5,4,3,2,1 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  bubbleSort(arr, sz, sizeof(arr[0]), cmp_int);
  print_arr(arr, sz);
}
void test4()
{
  struct Stu s[3] = { {"zhangsan",15},{"lisi",17},{"wangwu",20} };
  int sz = sizeof(s) / sizeof(s[0]);
  //qsort(s, sz, sizeof(s[0]), cmp_name);//按照名字排序
  bubbleSort(s, sz, sizeof(s[0]), cmp_age);//按照年龄来排序
}
int main()
{
  test3();
  return 0;
}


相关文章
|
6月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
125 7
|
7月前
|
机器学习/深度学习 算法 分布式数据库
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(下)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
42 1
|
7月前
|
算法
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(上)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
39 1
|
6月前
|
存储 算法 安全
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
47 0
|
7月前
|
存储 算法 搜索推荐
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
220 1
|
存储 算法
基础算法 - 常见算法模板题(最简洁写法)【下】
基础算法 - 常见算法模板题(最简洁写法)【下】
|
存储 人工智能 Serverless
基础编程题目集 函数题部分(上)
基础编程题目集 函数题部分
171 0
|
7月前
|
搜索推荐 算法 程序员
排序算法探秘:打造通用qsort函数
排序算法探秘:打造通用qsort函数
40 0
|
7月前
|
算法 搜索推荐 C语言
数据结构排序——详解快排及其优化和冒泡排序(c语言实现、附有图片与动图示意)
数据结构排序——详解快排及其优化和冒泡排序(c语言实现、附有图片与动图示意)
70 0
【冒泡排序】模仿qsort的功能实现一个通用的冒泡排序
【冒泡排序】模仿qsort的功能实现一个通用的冒泡排序
79 0

热门文章

最新文章