sort与qsort
sort(begin,end,cmp)(cmp可省略,默认为升序)
bool cmp(int a,int b)
void qsort( void *base, size_t num, size_t width, cmp )
int cmp(const void *a, const void *b) );
这里主要是说一些cmp函数
对于sort:bool cmp(int a,int b)
其返回值为bool类型,《机试指南》上说的挺好,当cmp的返回值为true时,表示cmp函数表示的第一个参数会排在第二个参数之前,即降序;若为false,表示cmp函数表示的第一个参数会排在第二个参数之后,即升序。
对于qsort:int cmp(const void *a, const void *b) );
返回值必须是int,这是和sort最大的区别,我这一天有点迷糊,自从在一篇博文上看到这句话,顿时醍醐灌顶。继续说,如果是升序,若a比b大返回正值1,a比b小返回负值-1,a与b相等返回0.逆序则相反,不再赘述。
下面是几个例子,主要是qsort,sort这里就不说了,例子是来自另外一个博客的,谢谢博主。原博客链接
1.对int类型数组排序
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b; //升序排序
//return *(int *)b - *(int *)a; //降序排序
}
qsort(s,n,sizeof(s[0]),cmp);
2.对char类型数组排序
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类型数组排序
int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
//返回值的问题,显然cmp返回的是一个整型,所以避免double返回小数而被丢失,用一个判断返回值。
}
qsort(in,100,sizeof(in[0]),cmp);
//附:排序结果的输出,一般建议用 “ %g ” 格式
/* 在这里多嘴一句,"%g"格式输出 虽然书上是说系统会自动选择 " %f " 格式 和 " %e " 格式 中长度较短的格式,并去掉无意义的0,但实际上系统如果选择了" %e ",系统会输出比 “ %e " 格式更省一位的格式输出。(此结论,来自VC6.0的实际操作)*/
4.对结构体排序一级
struct In
{
double data;
int other;
}s[100]
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写
int cmp( const void *a ,const void *b)
{
return (*(In *)a).data > (*(In *)b).data ? 1 : -1;
//注意,这条语句在VC6.0环境下运行可能会出错,但是并不是语句错了,而是你要先 Build ,或者全部重建。总之语句是对的。
//或者你可以将这上面1条语句改成下面这3条语句
//struct In *aa = (In *)a;
//struct In *bb = (In *)b;
//return aa->data > bb->data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);
5.对结构体排序二级
struct In
{
int x; //你可以比喻成:失败次数
int y; //你可以比喻成:成功次数
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序。 你可以想象成:失败是主要因素的一个问题,先比较 失败次数少,失败次数相同 再看 成功次数多。
int cmp( const void *a , const void *b )
{
struct In *c = (In *)a;
struct In *d = (In *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
6.对字符串排序
struct In
{
int data;
char str[100];
}s[100];
//按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(In *)a)->str , (*(In *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);
再次感谢博主JokerSmithWang
以及博主。