回调函数实现通用冒泡排序
#include<stdio.h>
#include<assert.h>
int compare(const void *, const void *);
void BubleSort(void *base, size_t num, size_t sz, int(*campare)(const void *a, void *b));
void BubleSort(void *base, size_t num, size_t sz, int(*campare)(const void *a, const void *b))
{
assert(base);//不要忘记检测参数合法性
char *str = (char*)base;
int flag = 0;
const void *p1;
const void *p2;
for (size_t i = 0; i < num - 1; ++i)
{
flag = 0;
for (size_t j = 0; j < num - i - 1; ++j)
{
p1 = (const void *)(str + j*sz);
p2 = (const void *)(str + (j + 1)*sz);
if (compare(p1, p2))
{
for (size_t k = 0; k < sz; k++)
{
str[j*sz + k] ^= str[(j + 1)*sz + k];
str[(j + 1)*sz + k] ^= str[j*sz + k];
str[j*sz + k] ^= str[(j + 1)*sz + k];
}
flag = 1;
}
}
if (0 == flag)
{
break;
}
}
}
int compare(const void *p1, const void *p2)
{
assert(p1&&p2);
const float *str1 = (const float *)p1;
const float *str2 = (const float *)p2;
return *str1 > *str2;
}
int main()
{
float arr[] = { 2.4, 3.2, 2.3, 5.67, 1.43, 35.12, 7.00 };
int num = sizeof(arr) / sizeof(arr[0]);
int(*cmp)(const void *p1, const void *p2) = compare;
BubleSort(arr, num, sizeof(int), cmp);
for (int i = 0; i < num; i++)
{
printf("%f\t", arr[i]);
}
system("pause");
}