#include <stdio.h>
// 比较函数的原型
typedef int (*CompareFunc)(int, int);
// 交换两个整数
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 冒泡排序函数,接收数组、数组大小和比较函数指针
void bubbleSort(int arr[], int n, CompareFunc compare) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (compare(arr[j], arr[j + 1])) {
swap(&arr[j], &arr[j + 1]);
}
}
}
}
// 升序比较函数
int ascending(int a, int b) {
return a > b;
}
// 降序比较函数
int descending(int a, int b) {
return a < b;
}
// 打印数组
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原始数组: ");
printArray(arr, n);
// 使用升序排序
bubbleSort(arr, n, ascending);
printf("升序排序后: ");
printArray(arr, n);
// 使用降序排序
bubbleSort(arr, n, descending);
printf("降序排序后: ");
printArray(arr, n);
return 0;
}
回调函数的作用和优势:
- 作用:回调函数在此处用于定义排序的比较规则。冒泡排序函数
bubbleSort
并不关心具体的比较逻辑(升序还是降序),而是通过接收一个函数指针compare
,在需要比较元素时调用该函数。这样,bubbleSort
函数本身变得通用,可以根据不同的比较规则进行排序。
- 优势:
- 代码复用:
bubbleSort
函数不需要为每种排序规则(升序、降序等)都编写一套单独的实现,只需要接收不同的比较函数指针即可。这大大提高了代码的复用性,减少了重复代码。
- 灵活性:可以根据具体需求在运行时选择不同的比较规则。例如,在不同的场景下,可能需要升序或降序排序,通过传递不同的回调函数,就可以轻松实现。
- 解耦:排序算法和比较规则解耦。排序算法只关注如何交换元素以实现排序,而比较规则由外部传入的回调函数定义。这使得代码结构更加清晰,易于维护和扩展。