引言:通过参考c语言库函数qsort:
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
完成回调函数实现冒泡排序字符串或数字:
代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> /* 函数功能:以char类型交换两个元素,大小为size。 */ void swap(char *p1,char *p2,int size) { int i = 0; char tmp = 0; for(i = 0;i<size;i++) { tmp = *(p1+i); *(p1+i) = *(p2+i); *(p2+i) = tmp; } } /* 函数功能:比较整数的回调函数。 */ int compare_int(const void *elem1,const void *elem2) { return (*(int *)elem1) - (*(int *)elem2); } /* 函数功能:比较字符串的回调函数。 */ int compare_str(const void *elem1,const void *elem2) { return strcmp((char *)(*(int *)elem1), (char *)(*(int *)elem2)); } /* 函数功能:冒泡排序函数。 */ void bubble_str_int(void *base,int size,int width,int ( *cmp )(const void *elem1, const void *elem2 )) { int i = 0; int j = 0; for(i = 0;i<size-1;i++) { for(j = 0;j<size-i-1;j++) { if(cmp(((char *)base+(j*width)),((char *)base+(j+1)*width))<0) { swap((char *)base+(j*width),(char *)base+(j+1)*width,width); } } } } int main() { char *arr_str[] = {"ddddd","aaaaa","ccccc","bbbbb","zzzzz"}; int arr_int[] = {1,3,5,7,9,2,4,6,8,10}; int i = 0; int size_int = sizeof(arr_int)/sizeof(arr_int[0]); int size_str = sizeof(arr_str)/sizeof(arr_str[0]); bubble_str_int(arr_int,size_int,sizeof(arr_int[0]),compare_int); printf("bubble_sort int:\n"); for(i = 0;i<size_int;i++) { printf("%d ",arr_int[i]); } printf("\n"); bubble_str_int(arr_str,size_str,sizeof(arr_str[0]),compare_str); printf("bubble_sort string:\n"); for(i = 0;i<size_str;i++) { printf("%s\n",arr_str[i]); } system("pause"); return 0; }
注:主要思想:排序的是什么元素都将其强制类型转换成(char*),因为可以把char当作一个基类。然后再根据排序元素的类型,将其强制类型转化成目标类型.
例如:
int compare_int(const void *elem1,const void *elem2) { return (*(int *)elem1) - (*(int *)elem2); }
把基类强制类型转换成int*再*就得到int类型的数据。compare_int函数也是如此。
原文:http://zhaoxiaohu.blog.51cto.com/10778115/1720540