冒泡排序我们都知道,就是比较相邻的数字大小,将数组从小到大排序。(前面的博客写过这个排序),那要是用冒泡排序完成不同类型的数据的排序呢? 这一下子就让我想到了sqort,上一篇博客才写过这个函数,特别是这个函数的参数,其中最后一个参数就是一个函数指针,可以指向不同的函数。那么我们可不可以用冒泡排序模拟一下sqort函数呢? 答案是肯定的,我们可以根据不同类型的数据写几个比较函数,然后将函数地址传给冒泡排序的最后一个参数,其他的和sqort相似。 下面我们就来看看这是如何实行的吧!
//自己完成一个冒泡排序(bubble_sort),可以完成不同类型数据的排序。 int cmp_int(const void * a,const void * b)//整形比较函数 { return *(int *)a - *(int *)b; } int cmp_double(const void * a,const void * b)//浮点数比较函数 { return *(double*)a > *(double*)b ? 1 : -1; } int cmp_string(const void * a,const void * b)//字符串比较函数 { return strcmp((const char *)a,(const char *)b); } void bubbleSort(void *data, int nums, int width, int (*cmp)(void *, void*)) { int i=0; int j=0; int k=0; int count=0; const void* p1 = NULL; const void* p2 = NULL; char*start=(char*)data; for(i=0;i<nums-1;i++) { for(j=0;j<nums-1-i;j++) { p1 = (const void*)(start + j* width); p2 = (const void*)(start + (j + 1)* width); if(cmp(p1,p2)>0) { for(k = 0; k < width; ++k) { start[j* width+k] = start[j*width+k]+start[(j+1)*width+k]; start[(j+1)*width+k] = start[j*width+k]-start[(j+1)*width+k]; start[j* width+k] = start[j*width+k]-start[(j+1)*width+k]; } count=1; } } if(!count) break; } } int main() { int i=0; int num[]={12,32,65,54,12,15,658,5621,34,0}; double dou[]={12.3,32.36,65.548,54.210,12.125,15.478,658.1,5621.2,34.3,0.456}; char *str[]={"enter","number","size","begin","of","cat","case","program","certain","a"}; bubbleSort(num, 10, sizeof(int), cmp_int); bubbleSort(dou, 10, sizeof(double), cmp_double); bubbleSort(str, 10, sizeof(char*), cmp_string); for(i=0;i<10;i++) { printf("%d ",num[i]); } printf("\n"); for(i=0;i<10;i++) { printf("%lf ",dou[i]); if(i==4) { printf("\n"); } } printf("\n"); for(i=0;i<10;i++) { printf("%s ",str[i]); } printf("\n"); system("pause"); return 0; }