一.排序

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
以及博主

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值