在这里,以一个数组为例:
#include<stdio.h>
void print(int* arr,int sz) //打印数组
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int cmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2; //e1>e2返回>0的数,e1==e2返回0,e1<e2返回<0的数
}
void swap(char* p1, char* p2, int width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2++;
}
}
void bubble_sort(void* base, int num, int width, int(*cmp)(const void* e1, const void* e2))
//对应的 形参用了void*类型的指针接收数据的起始地址,num和width接收数据的个数和每个数据的大小,函数指针接收函数地址
{
int i = 0;
for (i = 0; i < num - 1; i++) //趟数
{
int j = 0;
for (j = 0; j < num - 1 - i; j++) //每一趟比较的次数
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
//因为用了void*类型的指针接收数据起始地址,在这里我们强制类型转换为char*类型,这样每次就只能操作一个字节。
swap((char*)base + j * width, (char*)base + (j + 1) * width, width); //交换元素位置
}
}
}
void demo()
{
int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]); //求数组元素个数
bubble_sort(arr, sz, sizeof(arr[0]), cmp); //排序,参数分别表示数据的起始地址、需要比较的元素的个数、每一个元素的大小、函数地址
print(arr,sz); //打印
}
int main()
{
demo();
return 0;
}