一、实现
无类型指针可以接收任意类型的指针,如果想用纯C语言实现泛型冒泡排序,无类型指针是必不可少的。冒泡排序的排序原则是——相邻两个元素的交换。因为交换始终发生在相邻两个元素之间,所以冒泡排序是稳定的排序算法。
//用户自己提供
int comp(void *a, void *b) //a > b返回非零;否则返回0。
{
return *(int*)a > *(int*)b;
}
思考,泛型指针没有类型,所以直接进行自增(减)或者解引用操作都是不合法的,为了能和已知数据类型的指针一样进行操作,我们需要在参数列表中加入元素大小。冒泡是向后冒泡而且是升序的。想要实现降序只需要用户自身将比较函数comp修改即可。
static void exchange(void *e1, void *e2, int size) //一趟交换
{
void *sentry = (void *)malloc(size);
assert(NULL != sentry);
memcpy(sentry, e1, size);
memcpy(e1, e2, size);
memcpy(e2, sentry, size);
}
//数组指针 元素个数 元素大小 比较函数
void bubbleSort(void *arr, int n, int size, int(*comp)(void *a, void *b))
{
for (int i = 0; i < n-1; ++i) //控制循环趟数
{
int flag = 0;
for (int j = 1; j < n - i; ++j)
{
if (comp((char*)arr + (j - 1)*size, (char*)arr + j * size))
{
exchange((char*)arr + (j - 1)*size, (char*)arr + j * size, size);
flag = 1;
}
}
if (!flag)
break;
}
}
测试用例如下:
int main()
{
int arr[] = { 98,87,76,65,54,43,32,21,10};
int n = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, n, 4, comp);
for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
printf("\n");
return 0;
}