MyFunc.cpp文件内容
1 void swap (char *a, char *b, size_t width){ 2 char tmp; 3 while(width--){ 4 tmp = *a; 5 *a++ = *b; 6 *b++ = tmp; 7 } 8 } 9 //冒泡排序 base:数组首地址 num:数组元素个数 width:数组元素的字节 comp:为函数指针 10 void BubbleSort(void *base, size_t num, size_t width, int (*comp)(const void *, const void *)){ 11 char *end = (char *)base + num * width; 12 for(char *i = (char *)base; i < end; i += width){ 13 for(char *j = i + width; j < end; j += width){ 14 if((*comp)(i, j) > 0){ 15 swap(i, j, width); 16 } 17 } 18 } 19 }
MyFunc.h文件内容
1 void BubbleSort(void *, size_t , size_t , int (*)(const void *, const void *));
Main.cpp文件内容
1 // 2 //2016年6月1日 18:00 3 // 4 //爱白菜的小昆虫 5 // 6 //写一个对任意数组冒泡排序函数…… 7 //通过这个例子对空指针的运用 8 //通过这个例子对函数指针的使用 9 // 10 11 12 #include <stdio.h> 13 14 #include "MyFunc.h" 15 16 #define N 10 17 18 struct Point{ 19 int x; 20 char *str; 21 } p[] = { 22 {9, "nine"}, {8, "eight"}, {7, "seven"}, {6, "six"}, {5, "five"}, 23 {4, "four"}, {3, "three"}, {2, "two"}, {1, "one"}, {0, "zero"} 24 }; 25 26 int cmp1(const void *x, const void *y){ 27 Point *a = (Point *)x, 28 *b = (Point *)y; 29 return a->x - b->x; 30 } 31 //自己写比较函数 32 int cmp(const void *x, const void *y){ 33 int *a = (int *)x, 34 *b = (int *)y; 35 return *a - *b; 36 } 37 38 //自己写一个对任意数组都能排序的冒泡排序 39 int main(){ 40 int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; 41 42 puts(""); for(int i = 0; i < N; ++i) printf("%d ", arr[i]); 43 BubbleSort(arr, N, sizeof(int), cmp); 44 puts(""); for(int i = 0; i < N; ++i) printf("%d ", arr[i]); 45 puts(""); 46 47 puts("按照x升序"); 48 puts("排序前:"); for(int i = 0; i < N; ++i) printf("%d %s\n", p[i].x, p[i].str); 49 BubbleSort(p, N, sizeof(Point), cmp1); 50 puts("排序后:"); for(int i = 0; i < N; ++i) printf("%d %s\n", p[i].x, p[i].str); 51 52 return 0; 53 }
运行效果: