您的位置:首页 > 其它

qsort 调用技巧

2016-06-23 22:03 225 查看
//所在头文件 :stdlib.h
//<本文中排序都是采用的从小到大排序>
/*这里的原理是将值返回给qsort函数,比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返回小于零 qsort就认为 a<b*/


0.主函数

int main()
{
qsort(数组的首地址,需要排序的数量,sizeof(A[0]),cmp);
return 0;
}


1.对于int型数组进行排序

int cmp(const void *a,const void *b)
{   return *(int *)a-*(int *)b;  }


2.对于char型数组进行排序(其基本原理同int型数组排序)

int cmp(const void *a ,const void *b)
{
return *(char *)a-*(char *)b;
}


3.对于double型数组进行排序(注意 double型不能偷懒返回a-b(因为a-b是double型)

int cmp(const void *a ,const void *b)
{
return *(double *)a>*(double *)b?1:-1;
}


4.对于结构体数组一级进行排序

typedef struct
{  int  data;  int  other; } name;//类似该结构体即可
name test[100];
int cmp(const void *a ,const void *b)
{
return (*(name *)a).data-(*(name *)b).data;
}//排序关键字就是data(注意若为浮点型关键字,请仿照double写返回值语句)


5.对于结构体数组二级进行排序

//基本原理是当第一个关键字相同时,利用第二个关键字比较
name test[100];
int cmp(const void *a ,const void *b)
{
name *M=(name* )a,N=(name* )a;
if(M->other!=N->other)
return other->m-N->other;
else
return M->data!=N->data;
}
}//(注意若为浮点型关键字,请仿照double写返回值语句)
/*一般这个时候都在cmp函数里面先强制转换了类型,不要在return里面,这样程序会更清晰,并且绝对是没错的.*/
6.对字符串进行排序


1.普通二维数组存放

int cmp(const void*a,const void*b)
{
return strcmp((char *)a,(char *)b);
}
qsort(数组的首地址,需要排序的数量,sizeof(A[0]),cmp);


程序示例:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp(const void*a,const void*b)
{
return -strcmp((char *)a,(char *)b);
}
char c[10][10];
int main()
{
int i,j;
for(i=5;i>=0;i--)
for(j=0;j<7;j++) c[i][j]=i+'A';
printf("排序前\n");
for(i=0;i<=5;i++) puts(c[i]);
qsort(c,6,sizeof(c[0]),cmp);
printf("排序后\n");
for(i=0;i<=5;i++) puts(c[i]);
return 0;
}


2.用结构体存储


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);//原理同上


七、计算几何中求凸包的cmp//尚未验证

int cmp(const void *a,const void *b)

//重点cmp函数,把除了1点外的所有点,旋转角度排序

{

struct point *c=(point *)a;

struct point *d=(point *)b;

if( calc(*c,*d,p[1]) < 0)

return 1;

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))

//如果在一条直线上,则把远的放在前面

return 1;

else return -1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: