函数简介
调用时需要库函数<stdlib.h>
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
qsort函数要求使用者自定义一个比较函数,这样就可以比较任意类型的2个元素了(如结构体数据等)
int compareMyType (const void * a, const void * b)
{
if ( *(MyType*)a < *(MyType*)b ) return -1;
if ( *(MyType*)a == *(MyType*)b ) return 0;
if ( *(MyType*)a > *(MyType*)b ) return 1;
//简洁一点写:
//return (*(MyType*)a - *(MyType*)b);
}
使用函数
排序整数
#include <stdio.h>
#include <stdlib.h>
//比较函数
int cmp_int(const void* a,const void* b)
{
return (*(int*)a-*(int*)b);
}
//打印函数
void print_arr(int arr[],int sz)
{
for(int i = 0 ; i < sz ; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {9,8,6,5,3};
int sz = sizeof(arr)/sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),cmp_int);
print_arr(arr,sz);
return 0;
}
排序结构体
#include <stdio.h>
#include <stdlib.h>
struct Stu{
char name[20];
int age;
double score;
};
//通过结构体的年龄排序
int cmp_by_age(const void* e1,const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
/通过结构体的名字排序
int cmp_by_name(const void* e1,const void* e2)
{
return ((struct Stu*)e1)->name - ((struct Stu*)e2)->name;
}
//按姓名打印
void print(struct Stu arr[],int sz)
{
for(int i = 0; i < sz; i++)
{
printf("%s ",arr[i].name);
}
printf("\n");
}
void test()
{
struct Stu arr[3] = {
{"zhangsan",20,65.5},
{"lisi",22,88.0},
{"wangwu",23,90.0}
};
int sz = sizeof(arr)/sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),cmp_by_age);
print(arr,sz);
qsort(arr,sz,sizeof(arr[0]),cmp_by_name);
print(arr,sz);
}