1.qsort函数介绍
A.对应头文件<stdlib.h>
B.函数声明
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
base为比较内容开始位置的指针。
num为比较元素个数。
size为每个元素大小,单位是字节。
compar为比较函数的函数指针,需要我们自己编写,比较函数大于时返回大于0的数,小于时返回小于0的数,等于时返回0。
C.应用实例
truct peo
{
char name[20];
int age;
};
int cmp_stu_age(const void* e1, const void* e2)
{
return ((struct peo*)e1)->age - ((struct peo*)e2)->age;
}
int main()
{
struct peo stu[3] = { {"zhangsan",21}, {"lisi",34},{"wangwu",12} };
int sz = sizeof(stu) / sizeof(stu[0]);
qsort(stu, sz, sizeof(stu[0]), cmp_stu_age);//按年龄排序
//比较函数大于时返回大于0的数,小于时返回小于0的数,等于时返回0
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%s ", stu[i].name);
printf("%d ", stu[i].age);
printf("\n");
}
return 0;
}
qsort排序根据比较函数决定,比较函数大于时返回大于0的数,小于时返回小于0的数,等于时返回0。
2.自制qsort函数
void Change(char* buf1,char*buf2,int width)//交换函数
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void test1(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))
{
int i = 0;
for ( i = 0; i < sz-1; i++)
{
int j = 0;
for ( j = 0; j < sz-1-i; j++)
{
if (cmp((char*)base + width * j, (char*)base + width * (j + 1)) > 0)
{
Change((char*)base + width * j, (char*)base + width * (j + 1), width);
}
}
}
}
因为void*指针不能进行加减操作,也就是无法让其移动。我们可以将其强制转换成char*类型,一个字节一个字节进行移动,配上一个元素字节大小width实现移动目的。