库函数qsort通过快速排序可以实现对整形,字符型,结构体类型的排序。
我们也可以通过冒泡模拟实现这一函数的功能:
分析库函数qsort的调用:qsort(void* base, size_t num, size_t width, int (*cmp)(const void* buf1, const void* buf2)) 函数内部使用的是void*类型的指针,并需要你个cmp函数这里使用回调函数的方式进行调用。
下面是函数的实现:
void Swap(char* base1, char* base2,size_t width)
{
int i = 0;
for (i = 0; i < width; i++)
{
//将base1和base2地址的每个字节都交换
char tmp = *base1;
*base1 = *base2;
*base2 = tmp;
base1++;//base1指向下一位置
base2++;//base2指向下一位置
}
}
void bubble_qsort(void* base, size_t num, size_t width, int (*cmp)(const void* buf1, const void* buf2))
{
size_t i;
size_t j;
size_t flag = 0;
for (i = 0; i < num - 1; i++)
{
//一趟冒泡排序
for (j = 0; j < num - i - 1; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
//条件满足进行交换
Swap((char*)base+j*width, (char*)base + (j + 1) * width,width);
flag = 1;
}
}
//进行一趟冒泡排序没有要交换的元素说明已经按升序排列此时可以跳出循环
if (flag == 0)
break;
}
}
注意:因为要实现对整形,字符型等的排序故我们在函数内部使用强制类型转化将void*转化为char*类型以满足这一要求
3.函数的拓展:将cmp函数加以改动或将“cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0“改为”cmp((char*)base + j * width, (char*)base + (j + 1) * width) < 0“即可实现降序排列。
本人为C语言初学者代码如果有改进的地方忘大佬指导