#include <stdio.h>
// 比较函数类型定义
typedef int (*CompareFunc)(const void *, const void *);
// 通用排序函数
void mySort(void *arr, size_t length, size_t elementSize, CompareFunc compare) {
for (size_t i = 0; i < length - 1; ++i) {
for (size_t j = 0; j < length - i - 1; ++j) {
char *a = (char *)arr + j * elementSize;
char *b = (char *)arr + (j + 1) * elementSize;
if (compare(a, b) > 0) {
// 交换
char temp[elementSize];
for (size_t k = 0; k < elementSize; ++k) {
temp[k] = a[k];
a[k] = b[k];
b[k] = temp[k];
}
}
}
}
}
// 整数升序比较函数
int compareAscending(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
// 整数降序比较函数
int compareDescending(const void *a, const void *b) {
return (*(int *)b - *(int *)a);
}
int main() {
int arr[] = {5, 4, 3, 2, 1};
size_t length = sizeof(arr) / sizeof(arr[0]);
// 升序排序
mySort(arr, length, sizeof(int), compareAscending);
printf("升序排序结果: ");
for (size_t i = 0; i < length; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
// 降序排序
mySort(arr, length, sizeof(int), compareDescending);
printf("降序排序结果: ");
for (size_t i = 0; i < length; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
- 函数指针类型定义:
typedef int (*CompareFunc)(const void *, const void *);
定义了一个函数指针类型 CompareFunc
,该类型的函数接受两个 const void *
类型的参数,并返回一个 int
类型的值。这个函数指针用于指向具体的比较函数,例如升序或降序的比较函数。
- 通用排序函数
mySort
:
void mySort(void *arr, size_t length, size_t elementSize, CompareFunc compare)
:这个函数实现了通用的排序逻辑。它接受一个指向数组的指针 arr
,数组的长度 length
,每个元素的大小 elementSize
,以及一个比较函数的函数指针 compare
。
- 在函数内部,使用冒泡排序算法遍历数组。通过
compare
函数来判断相邻元素的顺序,如果需要交换则进行交换。这里使用 char *
指针进行字节级的操作,以确保能处理任意类型的数组。
- 整数升序比较函数
compareAscending
:
int compareAscending(const void *a, const void *b)
:该函数接受两个 const void *
类型的指针,将它们转换为 int *
类型,然后返回 *(int *)a - *(int *)b
。如果 a
小于 b
,返回负数;如果 a
等于 b
,返回0;如果 a
大于 b
,返回正数,以此实现升序排序。
- 整数降序比较函数
compareDescending
:
int compareDescending(const void *a, const void *b)
:与升序比较函数类似,只是返回值为 *(int *)b - *(int *)a
,实现降序排序。
- 主函数
main
:
- 定义一个整数数组
arr
并初始化。
- 调用
mySort
函数分别进行升序和降序排序,并输出排序结果。这样展示了函数指针在回调机制中的灵活运用,同时代码也考虑了处理不同类型数组的边界情况和健壮性。