实现一个bubble_sort(冒泡排序),可以完成不同类型数据的排序
需要借助库函数qsort 的思想去实现!
先完成函数原型:void bubble_sort(void* base, size_t num, size_t width, int(*compare)(const void* a, const void* b));
该函数的四个参数和qsort 的四个参数使用方法相同(如不清楚可参考我的上一篇对qsort详细介绍的博客);
同时需要完成比较函数,即第四个参数函数指针。
例(对整数的排序):
实现对整数的比较,
int IntCmp(const void* a, const void* b) //比较整型a,b的大小
{
return (*(int*)a>*(int*)b) ? 1 : -1;
}
然后在void bubble_sort(void* base, size_t num, size_t width, int(*compare)(const void* a, const void* b))函数内部按照一般的冒泡排序思路编程即可,
注意的是该函数在进行交换元素的时候以字节为单位进行交换;
交换函数如下:
void swap(size_t width, void* a, void* b) //按字节将两任意类型交换
{
char temp;
int k = 0;
for (k = 0; k<(int)width; k++)
{
temp = *((char*)a + k);
*((char*)a + k) = *((char*)b + k);
*((char*)b + k) = temp;
}
}
具体思路如上,我以整型排序和字符串数组的排序为例完成了以下代码:
#include<stdio.h> #include<string.h> int IntCmp(const void* a, const void* b) //比较整型a,b的大小 { return (*(int*)a>*(int*)b) ? 1 : -1; } int StrCmp(const void* a, const void* b) //比较字符串数组(可理解为二级指针)的大小 { return strcmp((char*)(*(int*)a), (char*)(*(int*)b))>0 ? 1 : -1; } void swap(size_t width, void* a, void* b) //按字节将两任意类型交换 { char temp; int k = 0; for (k = 0; k<(int)width; k++) { temp = *((char*)a + k); *((char*)a + k) = *((char*)b + k); *((char*)b + k) = temp; } } void bubble_sort(void* base, size_t num, size_t width, int(*compare)(const void* a, const void* b)) { int i = 0; int j = 0; int ret = 0; for (i = 0; i<(int)num - 1; i++) { for (j = 0; j<(int)num - i - 1; j++) { ret = compare(((char*)base + j*width), ((char*)base + (j + 1)*width)); //前面数据大返回1,否则返回-1 if (ret>0) //将大的数据换到后面 { swap(width, ((char*)base + j*width), ((char*)base + (j + 1)*width)); } } } } int main() { int i=0; int arr1[10]={1,3,5,7,9,2,4,6,8,10}; int len=sizeof(arr1)/sizeof(arr1[0]); bubble_sort(arr1,len,sizeof(arr1[0]),IntCmp); for(i=0;i<len;i++) { printf("%d ",arr1[i]); } /*int i = 0; char* arr[4] = { "aaa", "ddd", "ccc", "bbb" }; int len = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, len, sizeof(arr[0]), StrCmp); for (i = 0; i<len; i++) { printf("%s ", arr[i]); }*/ return 0; }整型排序结果:
字符串数组(二维数组)排序结果: