//第一次尝试:
#include<stdio.h> #include<stdlib.h> typedef void(*CMP)(int*, int*); CMP Bubbup(int* m, int* n) { if (*m > * n) { int t = 0; t = *m; *m = *n; *n = t; } } CMP Bubbdown(int* m, int* n) { if (*m < * n) { int t = 0; t = *m; *m = *n; *n = t; } } void BubbleSort(int* arr,int size,CMP cmp) { for (int i = 0; i < size; i++) { for (int j = 0; j < size - i; j++) { cmp(&arr[j], &arr[j + 1]); } } } int main() { int arr[10] = { 56,23,48,51,27,19,36,67,92,40 }; int size = sizeof(arr) / sizeof(arr[0])-1; for (int i = 0; i <= size; i++) { printf("%d ", arr[i]); }printf("\n"); //升序排序 BubbleSort(arr, size, Bubbup); for (int i = 0; i <= size; i++) { printf("%d ", arr[i]); }printf("\n"); //降序排序 BubbleSort(arr, size, Bubbdown); for (int i = 0; i <= size; i++) { printf("%d ", arr[i]); }printf("\n"); return 0; }
//使用函数指针,利用回调函数的机制,可以在一定的条件下,调用写好的函数,实现一定的功能
//1、定义一个函数(普通函数即可); 
//2、将此函数的地址注册给调用者; 
//3、特定的事件或条件发生时,调用者使用函数指针调用回调函数。 

 

//第二次尝试:
#include<stdio.h> #include<stdlib.h> int cmpup(int* a, int* b) { return *a - *b; } int cmpdown(int* a, int* b) { return *b - *a; } void myBubble(void* base, size_t size, size_t num, int (*CMP)(const void*, const void*)) { //使用char可以进行一个字节一个字节的加减,只要传入对应数组的类型字节大小 //就可以实现,通用数组类型的冒泡排序 char* st = (char*)base; //用来临时交换的数组,个的空见要足够大,不要pia气,要防止意外出现 char tmp[16]; for (int i = 0; i < num - 1; i++) { for (int j = 0; j < num - i - 1; j++) { if (CMP(st+j*size,st+(j+1)*size) > 0) { //memcpy(void* destin,void* source,unsigned n)函数,从源source中拷贝n个字节到目标destin中 //不知道传入数组的类型,就可以使用memcpy函数,然后根据输入类型字节大小,拷贝对应的字节 memcpy(tmp, st+j*size, size); memcpy(st+j * size, st+(j + 1) * size, size); memcpy(st+(j + 1) * size, tmp, size); } } } } int main() { int arr[10] = { 56,23,48,51,27,19,36,67,92,40 }; int size = sizeof(arr[0]); int num = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i < num; i++) { printf("%d ", arr[i]); }printf("\n"); //升序排序 myBubble(arr, size,num, cmpup); for (int i = 0; i < num; i++) { printf("%d ", arr[i]); }printf("\n"); //降序排序 myBubble(arr, size, num, cmpdown); for (int i = 0; i < num; i++) { printf("%d ", arr[i]); }printf("\n"); return 0; }
//这是改进之后的冒泡排序,现在功能更完整,可以对不同类型的数组进行排序,可以用户自定义一个函数来确定升序还是降序
//具体解析,详见代码中的注释