qsort 模板

转:http://blog.csdn.net/fans_men/article/details/6955606

 

七种qsort排序法

 

<本文中排序都是采用的从小到大排序> 

 

其中的在c语言中qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里。

 

一、对int类型数组排序  

 

[cpp] view plaincopy
 
  1. int num[n];   
  2.    
  3. int cmp(const void *a,const void *b)   
  4. {   
  5.      return *(int *)a-*(int *)b;   
  6. }   
  7. qsort(num,n,sizeof(num[0]),cmp);  


 

二、对char类型数组排序(同int类型) 

 

[cpp] view plaincopy
 
  1. char c[n];   
  2.    
  3. int cmp(const void *a,const void *b)   
  4. {   
  5.     return *(char *)a-*(char *)b;   
  6. }  
  7. qsort(c,n,sizeof(c[0]),cmp);  

  

 

三、对double类型数组排序(要特别注意)

 

[cpp] view plaincopy
 
  1. double num[n];  
  2.    
  3. int cmp(const void *a,const void *b)   
  4. {   
  5.     return *(double *)a>*(double *)b ? 1 : -1;   
  6. }   
  7. qsort(num,n,sizeof(num[0]),cmp);  


 

四、对结构体一级排序 

 

[cpp] view plaincopy
 
  1. struct stu  
  2. {  
  3.     double data;   
  4.     int other;   
  5. }s[n];     
  6.   
  7. /*按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可 
  8.   以很多种,参考上面的例子写 
  9. */   
  10. int cmp(const void *a,const void *b)   
  11. {   
  12.      return (*(struct stu *)a).data>(*(struct stu *)b).data ? 1 : -1;   
  13. }   
  14. qsort(s,n,sizeof(struct stu),cmp);  

 

 

五、对结构体二级排序 

 

[cpp] view plaincopy
 
  1. struct stu  
  2. {  
  3.     int x;  
  4.     int y;  
  5. }s[n];           
  6.   
  7. //按照x从小到大排序,当x相等时按照y从大到小排序  
  8. int cmp(const void *a,const void *b)  
  9. {  
  10.     struct stu *c=(stu *)a;  
  11.     struct stu *d=(stu *)b;  
  12.     if(c->x != d->x) return c->x - d->x;  
  13.     else return d->y - c->y;  
  14. }  
  15. qsort(s,n,sizeof(s[0]),cmp);  


 

六、对字符串进行排序 

 

[cpp] view plaincopy
 
  1. struct str  
  2. {   
  3.     int data;   
  4.     char c[100];   
  5. }s[n];              
  6.   
  7. //按照结构体中字符串c的字典顺序排序   
  8. int cmp(const void *a,const void *b)   
  9. {  
  10.     return strcmp((*(str *)a).c,(*(str *)b).c);   
  11. }   
  12. qsort(s,n,sizeof(s[0]),cmp);  


 

七、计算几何中求凸包的cmp 

 

[cpp] view plaincopy
 
  1. //重点cmp函数,把除了1点外的所有点,旋转角度排序   
  2. int cmp(const void *a,const void *b)   
  3. {   
  4.     struct point *c=(point *)a;   
  5.     struct point *d=(point *)b;   
  6.     if(calc(*c,*d,p[1])<0) return 1;   
  7.     else if(!calc(*c,*d,p[1])&&dis(c->x,c->y,p[1].x,p[1].y)<dis(d->x,d->y,p[1].x,p[1].y))   
  8.     //如果在一条直线上,则把远的放在前面   
  9.     return 1;   
  10.     else return -1;   
  11. }  
 
posted @ 2014-08-11 10:01  bibier  阅读(304)  评论(0编辑  收藏  举报