qsort--快排
用错了N久 wr的不行。。。最后换成sortA了。。。
基本:头文件<stdlib.h>
qsort(s,n,sizeof(s[0]),cmp);
s-数组名
n-需要排序的个数
sizeof(s[0])-每个数据所占内存
cmp-判断函数
整数数组排序:
#include <stdio.h> #include <stdlib.h> int cmp ( const void *a , const void *b ) { return *(int *)a > *(int *)b; } int main() { int a[5]={3,6,1,4,8},i; qsort(a,5,sizeof(a[0]),cmp); for(i=0;i<5;i++) printf("%d ",a[i]); }
//这是从小到大排序--改变cmp里的符号(‘>’--从小到大||'<'--从大到小)
char类型数组排序:
#include <stdio.h> #include <stdlib.h> int cmp ( const void *a , const void *b ) { return *(char *)a > *(char *)b; } int main() { char a[5]={'3','6','1','4','8'},i; qsort(a,5,sizeof(a[0]),cmp); for(i=0;i<5;i++) printf("%c ",a[i]); }
//和int一样 只是改变cmp里的数据类型
double型 据说需要x>y?1:-1;虽然不知道为啥:
#include <stdio.h> #include <stdlib.h> int cmp ( const void *a , const void *b ) { return *(double *)a > *(double *)b ? 1 : -1; } int main() { double a[5]={3.3,6.1,1.4,4.3,8.2}; int i; qsort(a,5,sizeof(a[0]),cmp); for(i=0;i<5;i++) printf("%.2lf ",a[i]); }
结构体排序:
#include <stdio.h> #include <stdlib.h> typedef struct In //注意typedef { int a; double b; }lim; int cmp ( const void *p , const void *q ) { const lim * n = (const lim *)p; const lim * m = (const lim *)q; if(n->a > m->a ) //判断大小顺序 return 1; else if(n->a < m->a) return -1; else return 0; } int main() { int a[5]={3,6,1,4,8}; int i; lim s[5]; for(i=0;i<5;i++) s[i].a=a[i]; qsort(s,5,sizeof(s[0]),cmp); for(i=0;i<5;i++) printf("%d ",s[i].a); }
结构体里数组排序:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int data; char str[100]; }lim; int cmp ( const void *a , const void *b ) { const lim * n = (const lim *)a; const lim * m = (const lim *)b; return strcmp(m->str , n->str ); //改变这个位置 改变排序方向 } int main() { int a[5]={3,6,1,4,8}; int i; lim s[5]; printf("输入3个字符串: "); for(i=0;i<3;i++) gets(s[i].str); qsort(s,3,sizeof(s[0]),cmp); for(i=0;i<3;i++) puts(s[i].str); }
//看不懂下面的
七、计算几何中求凸包的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;
}