第一次尝试
#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;
}
使用函数指针,利用回调函数的机制,可以在一定的条件下,调用写好的函数,实现一定的功能:
- 定义一个函数(普通函数即可);
- 将此函数的地址注册给调用者;
- 特定的事件或条件发生时,调用者使用函数指针调用回调函数。
第二次尝试
#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;
}
这是改进之后的冒泡排序,现在功能更完整,可以对不同类型的数组进行排序,可以用户自定义一个函数来确定升序还是降序,具体解析,详见代码中的注释。