qsort采用快速排序的方法进行排序,存在于头文件<stdlib.h>中,其原型为:
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
利用其排序关键在于写出数据比较的方法,即函数cmp()
1、对整型数据排序
int num[100];
int cmp(const void*a,const void*b)
{
return *(int *)a-*(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);
2、对字符型数据排序
char word[100];
int cmp(const void*a,const void*b)
{
return *(char *)a-*(char *)b;
}
qsort(word,100,sizeof(word[0]),cmp);
3、对浮点型数据排序
double real[100];
int cmp(const void*a,const void*b)
{
return *(double *)a>*(double *)b?1:-1;
}
qsort(real,100,sizeof(real[0]),cmp);
直接返回两数之差可能由于返回类型为int导致数据出错。
4、对字符串类型排序
char str[100][100];
int cmp(const void*a,const void*b)
{
return strcmp((char *)a,(char *)b);
}
qsort(str,n,sizeof(str[0]),cmp);
5、对结构体变量进行排序(根据结构体内成员变量大小进行)
struct student
{
int ID;
double score;
}std[100];
int cmp(const void*a,const void*b)
{
return (*(student*)a).score>(*(student*)b).score?1:-1;
}
qsort(std,100,sizeof(std[0]),cmp);
struct point
{
int x;
int y;
}p[100];
int cmp(const void*a,const void*b)
{
struct point *p1=(point *)a;
struct point *p2=(point *)b;
if(p1->x!=p2->x)
return p1->x-p2->x;
else
return p1->y-p2->y;
}
qsort(p,100,sizeof(p[0]),cmp);
struct student
{
int ID;
char name[100];
}std[100];
int cmp(const void*a,const void*b)
{
return strcmp((*(student *)a)->name,(*(student *)b)->name);
}
qsort(std,100,sizeof(std[0]),cmp);
与qsort相比较,sort则比较简单,对一般的内置类型而言,不需要编写cmp()函数即可。对结构体变量进行排序时,需要编写相应的比较函数,或者直接在结构体内写关系运算符的重载函数即可。
bool operator==(const student &std1,const student &std2)
{
return std1.ID==std2.ID&&std1.name==std2.name&&std1.adress==std2.adress;
}
bool operator!=(const student &std1,const student &std2)
{
return std1==std2;
}
bool operator<(const student &std1,const student &std2)
{
return std1.ID<std2.ID;
}
bool operator>(const student &std1,const student &std2)
{
return std1.ID>std2.ID;
}
bool operator<(const student &std)const
{
return score<std.score
}