前言
上一投稿写了qsort在(浮点型 , 整形 ,字符串 ,结构体)这些的使用方式,而今天就来说一说他 的万能接口,在上述类型功能都能使用他。

这是一段通用型冒泡排序的 C 语言实现代码,核心特点是通过void*和函数指针实现 “任意类型数据的排序”(比如 int、float、结构体等)
一、函数参数说明
void* base:待排序数组的首地址(用void*表示 “任意类型数组”);size_t sz:数组的元素个数;size_t width:数组中单个元素的字节大小(比如 int 是 4 字节,double 是 8 字节);int(*comp)(const void* p1, const void* p2):比较函数的指针—— 用来定义两个元素的比较规则(返回值 > 0 则交换,=0 不交换,<0 也不交换)。(qsort特性)
(1).比较元素:通过函数指针实现通用比较
if (comp((char*)base + j * width, (char*)base + (j+1) * width) > 0)
- 把
void* base强转为char*:因为char*是 1 字节步长,方便通过j*width计算第 j 个元素的地址(比如元素是 int(4 字节),j=2 时,地址是base + 2*4); - 调用
comp函数:传入第 j 个和第 j+1 个元素的地址,由comp决定 “谁大谁小”—— 如果返回值 > 0,说明需要交换这两个元素。
(2). 函数参数与返回值

用void*是为了适配通用排序函数的接口(通用排序函数的比较器参数必须是void*,以支持任意类型)
返回值:int
- 规则:
*(int*)p1 - *(int*)p2- 先将
void*强转为int*(因为传入的实际是int变量的地址),再通过*取值; - 若返回值 > 0:说明
p1指向的整数 >p2指向的整数; - 若返回值 = 0:说明两个整数相等;
- 若返回值 < 0:说明
p1指向的整数 <p2指向的整数
- 先将
补充:if里面做判断时调用comp_int函数来去做返回值是否>0;
Samp((char*)base + j * width, (char*)base + (j + 1) * width, width);
Samp是自定义的 “通用交换函数”(需要自己实现):接收两个元素的地址和元素宽度,交换这两个元素的内容(这样不管是 int、结构体,都能正确交换)- 原理:数组中第
j个元素的地址 = 数组首地址 + 元素索引 × 单个元素的字节大小
(3)交换

buf++是为了下次循环到下一个元素做比较;
706

被折叠的 条评论
为什么被折叠?



