例题: 输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
#include <stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
return *((int*)e1) - *((int*)e2);
//自定义排序函数
//其中自定义排序函数的返回值如下
//< 0 elem1将被排在elem2前面
//= 0 elem1 等于 elem2
//> 0 elem1 将被排在elem2后面
}
int main()
{
int sz;
scanf("%d", &sz);
int i = 0;
int arr[100] = { 0 };
for (i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);
}
qsort(arr, sz, sizeof(arr[0]), cmp_int);
//使用C语言自带的排序库qsort来排序
//qsort的强大之处在于对任何数据类型都可以排序,排序时不需要再定义数据类型,
//而不是写出的排序代码只能排序单一数据类型;
//qsort的参数分别为
//待排序的起始位置、元素个数、元素大小、自定义排序函数指针。
for (i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
return 0;
}
C语言中qsort的定义为:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
其中void*base代表的是/待排序的起始位置、size_t nmu是元素个数、size_t width是元素大小、int(__cdecl*compare)(const void*,const void*));是自定义的排序函数的指针,传入的两个参数分别为const void*和const void*。函数返回值< 0 ,elem1将被排在elem2前面;= 0 elem1 等于 elem2;> 0 elem1 将被排在elem2后面。
使用qsort函数能避免我们写的代码只能排序单一的数据类型,要想排序字符或者字符串类型,只需要在定义比较函数时把e1,e2强制转化成需要排序数据的类型即可,字符比较如下:
int cmp_char(const void* e1, const void* e2)
{
return *((char*)e1) - *((*)e2);
}
字符串比较函数如下(用strcmp来比较字符串):
int cmp_str(const void* e1, const void* e2)
{
return strcmp(*((int*)e1) ,*((int*)e2));
}
结构体排序如下:
int cmp_stract(const void* e1, const void* e2)
{
return ((int*)e1)->age - ((int*)e2)->age;
//可以指向任意的结构体数据,需要注意的是,结构体数据的类型,及时把(int*)换成需要比较的类型
}