冒泡排序我们都知道,就是比较相邻的数字大小,将数组从小到大排序。(前面的博客写过这个排序),那要是用冒泡排序完成不同类型的数据的排序呢?
这一下子就让我想到了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;
}