注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

记录创意的火花

天天学习,好好向上

 
 
 

日志

 
 

qsort()使用--按指定方式进行排序  

2012-06-15 20:29:17|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

下面讲下VC中库函数qsort()的用法:

 

函数原型:

void qsort(void *base,size_t num,size_t width, int (__cdecl *compare )(const void *, const void *) );

第一个是数组地址,第二是数组大小,第三个是数组中每个元素的字节数,最后一个是个函数指针,表示如何比较数组中的元素。

头文件 #include <stdlib.h>

 

 

下面分别就int等整数数据,double等浮点数据,结构体和类,按指定方式这四种情况进行讲解。

 

实例1   对int等整数数据进行排序

  1. int cmp(const void *x, const void *y)  
  2. {  
  3.     return *(int*)x - *(int*)y;  
  4. }  
  5. qsort(a, MAXN, sizeof(a[0]), cmp);   

MAXN为数组大小,下同

 

实例2   对double等浮点数进行排序

  1. int cmpDouble(const void *x, const void *y)  
  2. {  
  3.     return (*(double*)x > *(double*)y ? 1 : -1);  
  4. }  
  5. qsort(a, n, sizeof(a[0]), cmpDouble);  

 

实例3  对结构体,类等复杂数据进行排序

  1. struct Student  
  2. {  
  3.     char szName[30];  
  4.     int  nAge;  
  5. };  

先对年龄排序,年龄相同再按姓名排序。

  1. int cmpStudent (const void *x, const void *y)  
  2. {   //先作下指针转换,再按要求比较  
  3.     Student *pNodex = (Student*)x, *pNodey = (Student*)y;  
  4.     if (pNodex->nAge != pNodey->nAge)  
  5.         return pNodex->nAge - pNodey->nAge;  
  6.     else  
  7.         return strcmp(pNodex->szName, pNodey->szName);  
  8. }  
  9. qsort(a, n, sizeof(a[0]), cmpStudent);  


实例4     按指定方式进行排序。

如对只有大小写字母的字符串"AajkuKdYUBCDwyz"进行排序,要求大写字母在前,小写字母在后。

  1. int cmp1(const void *x, const void *y)  
  2. {  
  3.     char *pcx = (char*)x, *pcy = (char*)y;  
  4.   
  5.     bool flag1 = *pcx >= 'A' && *pcx <= 'Z';  
  6.     bool flag2 = *pcy >= 'A' && *pcy <= 'Z';  
  7.   
  8.     if(flag1 == flag2)    //如果都为大写字母或都为小写字母  
  9.         return *pcx - *pcy;  
  10.     else                  //否则,谁为大写字母,谁的权值小。  
  11.         return flag1 ? -1 : 1;  
  12. }  
  13. int main()  
  14. {  
  15.     char szText[] = "AajkuKdYUBCDwyz";  
  16.     qsort(szText, strlen(szText), sizeof(szText[0]), cmp1);  
  17.     printf("%s\n", szText);  
  18.     return 0;  
  19. }  


  评论这张
 
阅读(940)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017