qsort排序(即快排)

qsort是C语言中用二分法进行的快速排序,其时间复杂度为n*log(n);
库函数名为:#include<stdlib.h>
基本形式为:qsort(a,n,sizeof(..),cmp);
1:对整形数组排序
  例如a[5]={1,4,3,5,2};
用函数qsort(a,5,sizeof(a[0]),cmp);
其中cmp为 函数为
cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;//要尽量强制转换类型
}
2:字符的排序
其他和整形一样,函数为
int cmp(const void *a,const void *b)
{
return *(char *)a-*(char *)b;
}
3:对于double型数据  稍有不同   原理同int这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)<1e-20之类的这样来判断,所以这里只返回了1和-1。
int cmp(const void * a, const void * b)
  {
  return((*(double*)a-*(double*)b>0)?1:-1);
  }
4:对于二维数组的排序转化为结构体比较简单;
5:对于结构体一级排序
例:
#include<stdio.h>
#include<stdlib.h>
struct coord //coord的意思是'坐标'
{
int x;
int y;
}s[100];
int cmp(const void *a,const void *b)
{
return (* (struct coord *)a).y>(*(struct coord *)b).y?1:-1;//根据y的大小进行排序 ?1:-1 从小到大?-1:1从大到小
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&s[i].x,&s[i].y);
for(i=0;i<n;i++)
printf("%d %d ",s[i].x,s[i].y);
putchar('\n');
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i<n;i++)
printf("%d %d ",s[i].x,s[i].y);
return 0;
}
6:对于结构体二级排序
#include<stdio.h>
#include<stdlib.h>
struct coord //coord的意思是'坐标'
{
int x;
int y;
}s[100];
int cmp(const void *a,const void *b)
{
if((*(struct coord *)a).x!=(*(struct coord *)b).x)
return (*(struct coord *)a).x>(*(struct coord *)b).x?1:-1; //按照x从小到大排序 当x相等时按照y从小到大排序
else
return (*(struct coord *)a).y>(*(struct coord *)b).y?1:-1;
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&s[i].x,&s[i].y);
for(i=0;i<n;i++)
printf("%d %d ",s[i].x,s[i].y);
putchar('\n');
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i<n;i++)
printf("%d %d ",s[i].x,s[i].y);
return 0;
}
 7:对字符串进行排序 

struct In

{
int data;

char str[100];
}s[100];
//按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(struct In *)a).str , (*(struct In *)b).str );
}
qsort(s,100,sizeof(s[0]),cmp);

8:二维数组进行字符串排序

比如char a[10][100];

对字符串a[0],a[1]……a[9]按字典顺序排序

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

{

return strcmp((char *)a,(char *)b);
}

qsort(a,10,sizeof(char)*100,cmp);

9:计算几何中求凸包的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;
}

此为自己总结,经过实验,修改了多次,和大家共享!如有错误 请指正。
原文地址:https://www.cnblogs.com/hsqdboke/p/2384491.html