qsort基本格式
功 能: 使用快速排序例程进行排序
头文件:stdlib.h
void qsort(void*base,
size_t num,
size_t width,
int(__cdecl*compare)(const void*,const void*)
)
各参数:
1 数组名(待排序数组首地址 )
2 数组中待排序元素数量
3 各元素的占用空间字节数 (sizeof(类型/对象))
4 指向函数的指针,指向cmp函数,决定排序顺序(见下)
补充:cmp函数
int cmp(const void*a,const void*b) //a,b为指针,可以指向任意类型的值,但指向的值必须为常量
{
return *(int*)a-*(int*)b; //先强制类型转换,再取内容
}
若升序,则a>b时返回一个正值;
若降序,则a>b时返回一个负值。
注例
以下各例均为从小到大排序,毫无健壮性可言。
对int排序
#include <stdio.h>
#include <stdlib.h>
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
int main(int argc, char *argv[])
{
int n,i;
int buf[100];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;++i)
scanf("%d",&buf[i]);
qsort(buf,n,sizeof(buf[0]),cmp);
for(i=0;i<n;++i)
printf("%d ",buf[i]);
}
return 0;
}
对结构体排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct E
{
char name[101];
int age;
int score;
} buf[1000];
int cmp(const void* x, const void* y)
{
struct E* a = (struct E*)x;
struct E* b = (struct E*)y;
int temp;
if(a->score!=b->score) return a->score-b->score; //分数不同,分数低的在前
temp = strcmp(a->name,b->name);
if(temp!=0) return temp;//分数相同,名字不同,ASCII小的在前
else return a->age-b->age;//分数姓名都相同,年龄小的在前
}
int main(int argc, char *argv[])
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;++i)
scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].score);
qsort(buf,n,sizeof(buf[0]),cmp);
for(i=0;i<n;++i)
printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
}
return 0;
}