1.基本了qusort的形式
首先我们要了解qusort的基本形式,可以在cplusplus网站上进行查询。(以下为我的查询结果)
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
注:1.base表示数组名(首元素地址),
2.num表示数组中待排序的元素个数,
3.size表示待排序数字的类型所占字节长度,
4.int(*compar)(const void*,const void*)则表示一个函数指针(指向一个返回类型为int,参数为(const void*,const void*的函数))
了解了该库函数的基本形式之后,我们就要对其形式进行一个深入理解,首先是base,这个很容易理解,毕竟是要对一个数组进行排序,不传入数组怎么能行呢。然后是num,这个也容易理解,就是待排序的数量嘛。那主要就是size和(*compar)这个两个参数不是很清楚了。既然是排序,那传入一个类型所占长度和一个函数指针这是要干什么呢。这就关乎qusort本身啦,首先qusort是要实现一个无类型排序及无论传入什么类型都可以排序,这也是base前置类型是void*的原因(因为如果定义成其他类型比如int*类型,char*就不好传入),既然不确定传入的类型又要实现一个交换的功能,那就可以传入类型所占长度,一个字节一个字节的进行交换。同样,因为类型的不确定,我们需要自己编写一个比较函数,然后将函数名进行传入。
2.模仿实现无类型的冒泡排序(以整形排序为例)
1.首先模仿编写函数名
如:
void bubble_sort(void* arr,int len,int sz,int (*cmp)(const void*,const void*))
2.编写函数体
主体是冒泡排序就不多过赘述了,直接上代码
int i, j;
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - 1 - i; j++)
{
if (cmp((char*)arr + j * sz, (char*)arr + (j + 1) * sz) > 0)
{
my_swap((char*)arr + j * sz, (char*)arr + (j + 1) * sz);
}
}
}
这里需要注意的是因为我们传入的数组是无类型的,我们又要方便比较,所以进行一个(char*)的强转操作,这时传入的size可以用来完成跳过一个元素的操作。
3.编写交换函数
上面已经讲过,因为不知道传入类型,所以我们可以一个字节一个字节的进行交换,而又因为char类型是占一个类型的,所以我们这里可以适当的进行强转。
如
void my_swap(const void*p1,const void*p2)
{
int num = (char*)p2 - (char*)p1;
int i;
for (i = 0; i < num; i++)
{
char temp = *((char*)p1 + i);
*((char*)p1 + i) = *((char*)p2 + i);
*((char*)p2 + i) = temp;
}
}
到这里,无类型的冒泡排序基本上就实现了,在编写一个比较函数就可以用了。
这里附上我的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/*qusort() 1.待排数组 2.数据长度 3.排序数目 4.排序函数 */
int cmp(const void* p1, const void* p2)
{
return (*(int*)p1 - *(int*)p2);
}
void my_swap(const void*p1,const void*p2)
{
int num = (char*)p2 - (char*)p1;
int i;
for (i = 0; i < num; i++)
{
char temp = *((char*)p1 + i);
*((char*)p1 + i) = *((char*)p2 + i);
*((char*)p2 + i) = temp;
}
}
void bubble_sort(void* arr,int len,int sz,int (*cmp)(const void*,const void*))
{
int i, j;
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - 1 - i; j++)
{
if (cmp((char*)arr + j * sz, (char*)arr + (j + 1) * sz) > 0)
{
my_swap((char*)arr + j * sz, (char*)arr + (j + 1) * sz);
}
}
}
}
int main()
{
int arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
bubble_sort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),cmp);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}