qsort及其用法.docx
- 文档编号:11517578
- 上传时间:2023-03-02
- 格式:DOCX
- 页数:23
- 大小:18.80KB
qsort及其用法.docx
《qsort及其用法.docx》由会员分享,可在线阅读,更多相关《qsort及其用法.docx(23页珍藏版)》请在冰豆网上搜索。
qsort及其用法
qsort及其用法
一、函数原型
voidqsort(void*base,size_tnum,size_twidth,int(__cdecl*compare)(constvoid*elem1,constvoid*elem2));
大概的意思是,第一个参数指明了要排序的数组(比如:
程序中的num),第二个参数给出了数组的大小(qsort没有足够的智力预知你传给它的数组的实际大小),第三个参数给出了数组中每个元素以字节为单位的大小。
最后那个长长的家伙,给出了排序时比较元素的方式..
再给一个例子:
inta[n];
qsort(a,n,sizeof(int),comp);//从小到大排序
intcomp(constvoid*a,constvoid*b)
{
int*x=(int*)a;
int*y=(int*)b;
return*x-*y; //如果a>b返回正数,如果a
}
二、qsort用法
1、对int类型数组排序
intnum[100];
Sample:
intcmp(constvoid*a,constvoid*b)
{
return*(int*)a-*(int*)b;
}
qsort(num,100,sizeof(num[0]),cmp);
2、对char类型数组排序(同int类型)
charword[100];
Sample:
intcmp(constvoid*a,constvoid*b)
{
return*(char*)a-*(int*)b;
}
qsort(word,100,sizeof(word[0]),cmp);
3、对double类型数组排序(特别要注意)
doublein[100];
intcmp(constvoid*a,constvoid*b)
{
return*(double*)a>*(double*)b?
1:
-1;
}
qsort(in,100,sizeof(in[0]),cmp);
4、对结构体一级排序
structIn
{
doubledata;
intother;
}s[100]
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写
intcmp(constvoid*a,constvoid*b)
{
return(*(In*)a)->data>(*(In*)b)->data?
1:
-1;
}
qsort(s,100,sizeof(s[0]),cmp);
5、对结构体二级排序
structIn
{
intx;
inty;
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
intcmp(constvoid*a,constvoid*b)
{
structIn*c=(In*)a;
structIn*d=(In*)b;
if(c->x!
=d->x)returnc->x-d->x;
elsereturnd->y-c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
6、对字符串进行排序
structIn
{
intdata;
charstr[100];
}s[100];
//按照结构体中字符串str的字典顺序排序
intcmp(constvoid*a,constvoid*b)
{
returnstrcmp((*(In*)a)->str,(*(In*)b)->str);
}
qsort(s,100,sizeof(s[0]),cmp);
自己写一个纯字符串的:
(temp是二维的字符串数组,j是一共需排序的字符串个数)
intcmpstr(constvoid*a,constvoid*b)
{
returnstrcmp((char*)a,(char*)b);
}
qsort(temp,j,sizeof(temp[0]),cmpstr);
7、计算几何中求凸包的cmp
intcmp(constvoid*a,constvoid*b)//重点cmp函数,把除了1点外的所有点,旋转角度排序
{
structpoint*c=(point*)a;
structpoint*d=(point*)b;
if(calc(*c,*d,p[1])<0)return1;
elseif(!
calc(*c,*d,p[1])&&dis(c->x,c->y,p[1].x,p[1].y)
return1;
elsereturn-1;
}
qsort()是c程序库stdlib.h中的一个函数,需要比较函数完成排序;
sort()是STL中的标准算法。
#include
intcmp(constvoid*a,constvoid*b)
{
return*((int*)b)-*((int*)a);
}
.
.
.
qsort(q,n,sizeof(int),cmp);
.
.
.
}
qsort对一维数组和字符串数组的排序:
#include"stdio.h"
#include"stdlib.h"
inta[100];
intcmp(constvoid*p,constvoid*q)
{
return(*(int*)p)-*((int*)q);
}
intmain()
{
intn;
scanf("%d",&n);
for(inti=0;i scanf("%d",&a[i]); qsort((void*)a,n,sizeof(a[0]),cmp); for(inti=0;i printf("%d\n",a[i]); //while (1); intcmp(constvoid*p,constvoid*q) { returnstrcmp((char*)p,(char*)q); } intmain()return0; } #include"stdio.h" #include"stdlib.h" #include"string.h" chara[20005][25]; { intn,m,i,j; while (1) { scanf("%d%d",&n,&m); if(n==0&&m==0)break; for(i=0;i { scanf("%s",a[i]); } qsort((void*)a,n,sizeof(a[0]),cmp); for(i=0;i printf("%s\n",a[i]); } strtok(字符串拆分)说明 首次完成对字符串分割后,分隔符会被变成空格,此时如果将第一个参数置NULL即会按顺序返回每个子字符串,每调用一次返回一个,所以token会改变。 当后面不再有子字符串了,就会返回NULL 首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。 strtok在s中查找包含在delim中的字符并用NULL('')来替换,直到找遍整个字符串。 char*p=strtok(s,";"); p=strtok(null,";"); 在调用的过程中,字串s被改变了,这点是要注意的。 1029IgnatiusandthePrincessIV 输入 5 13233 11 11111555555 7 1111111 输出 3 5 1 实现 #include intmain() { longn,num,cnt,res; while(EOF! =scanf("%d",&n)) { cnt=0;//用于判断数字是否出现一半以上 while(n--) { scanf("%d",&num); if(0==cnt) { res=num; cnt++; } else { if(res==num) cnt++; else cnt--; } } printf("%d\n",res); } return0; } 1040aseasyasA+B 输入 2 3213 9147258369 输出 123 123456789 实现 #include #include intcmp(constvoid*a,constvoid*b) { return*(int*)a-*(int*)b; } main() { intx;//要对x组数据进行排序 intp;//对多少个数进行排序 inta[1000];//排序用的数组 inti,j,n;//循环条件 scanf("%d",&x); for(i=0;i { scanf("%d",&p); for(j=0;j { scanf("%d",&a[j]); } qsort(a,p,sizeof(int),cmp); printf("%d",a[0]); for(n=1;n { printf("%d",a[n]); } printf("\n"); system("pause"); } } 1106排序 输入 0051231232050775 输出 07712312320 实现 #include #include #include intcmp(constvoid*a,constvoid*b) { return*(int*)a-*(int*)b; } intmain() { charc[1000];//要处理的字符串 inti,j,m; inta[1000];//处理后的数据存放的位置 intb=0; char*p; while(scanf("%s",c)! =EOF) { i=0; j=0; p=strtok(c,"5"); while(NULL! =p) { a[j++]=atoi(p);//把字符串转换成整形 p=strtok(NULL,"5"); } qsort(a,j,sizeof(int),cmp); printf("%d",a[0]); for(m=1;m { printf("%d",a[m]); } printf("\n"); } system("pause"); return0; } 1236排名 输入 4525 1010121315 CS0043513 CS003524135 CS002212 CS0013235 1240 1030 CS00112 2320 101010 CS0000000000000000010 CS000000000000000002212 0 输出 3 CS00360 CS00137 CS00437 0 1 CS00000000000000000220 实现 #include #include #include structstudent { unsignedinta;//分数 charc[21];//学号 }; intcmp(constvoid*x,constvoid*y) { structstudent*m=(structstudent*)x; structstudent*n=(structstudent*)y; if(m->a! =n->a)returnn->a-m->a; elsereturnstrcmp(m->c,n->c); } intmain() { structstudentstu[999];//学生信息 unsignedintb[10]; charch[21]; unsignedintM,N,G;//N考生人数,M考题数,G分数线 unsignedintm,g; intj,i,r; ints; while(scanf("%u",&N),N! =0) { scanf("%u%u",&M,&G); for(i=0;i { scanf("%u",&b[i]); } r=0;//过线人数 for(i=0;i { scanf("%s%u",ch,&m);//录入学号,和作对题数 s=0; for(j=0;j { scanf("%u",&g);//输入作对的题号 s+=b[g-1];//计算分值 } if(s>=G) { strcpy(stu[r].c,ch);//将过线人的学号录入结构体注: strcpy给字符串赋值 stu[r].a=s;//将过线人的成绩录入结构体 r++; } } qsort(stu,r,sizeof(stu[0]),cmp); printf("%d\n",r); for(i=0;i { printf("%s%u\n",stu[i].c,stu[i].a); } } return0; } 1412{A}+{B} 输入 12 1 23 12 1 12 输出 123 12 实现 #include #include intcmp(constvoid*a,constvoid*b) { return*(int*)a-*(int*)b; } intmain() { inta[20000]; intm,n,i,j,tem; while(scanf("%d%d",&n,&m)! =EOF)//n为第一个集合元素个数,m为第二个元素铬数 { for(i=0;i { scanf("%d",&a[i]); } for(j=0;j { scanf("%d",&tem);//中间变量,用于去除重复值 for(i=0;i { if(tem==a[i]) { break; } } if(i==n)//元素不重复,将值录入到数组a中 { a[n]=tem; n++; } } qsort(a,n,sizeof(int),cmp); printf("%d",a[0]);为了使输出格式复合要求 for(i=1;i { printf("%d",a[i]); } printf("\n"); system("pause"); } } 1029IgnatiusandthePrincessIV 输入 5 13233 11 11111555555 7 1111111 输出 3 5 1 实现 #include intmain() { longn,num,cnt,res; while(EOF! =scanf("%d",&n)) { cnt=0; while(n--) { scanf("%d",&num); if(0==cnt) { res=num; cnt++; } else { if(res==num) cnt++; else cnt--; } } printf("%d\n",res); } return0; } 1280前m大的数 输入 44 1234 45 5364 输出 7655 1110998 实现 #include intmain() { inta[3000]; intb[1001]; inti,j,r=0,v; intm,n; intx; while(scanf("%d%d",&n,&m)! =EOF) { for(i=0;i { scanf("%d",&a[i]); } for(i=0;i { for(j=i;j { if(i! =j) { x=a[i]+a[j];//计算任意两数的和 if(r==0) { b[r]=x; } else { for(v=r-1;v>=0;v--)//求出前m大的数 { if(x>b[v]) { b[v+1]=b[v]; } else { b[v+1]=x; break; } if(v==0) { b[v]=x; } } } if(r r++;//前r大的数 } } } printf("%d",b[0]); for(i=1;i { printf("%d",b[i]); } printf("\n"); } } 2673 输入 5 12345 输出 51423 实现 #include #include intcmp1(constvoid*a,constvoid*b) { return*(int*)a-*(int*)b; } intcmp2(constvoid*a,constvoid*b) { return*(int*)b-*(int*)a; } intmain() { inta[10001]; intb[10001]; intx; while(scanf("%d",&x)! =EOF) { inti,j,v,r=0,tem; for(i=0;i { scanf("%d",&a[i]); b[i]=a[i]; } qsort(a,x,sizeof(int),cmp2); qsort(b,x,sizeof(int),cmp1); printf("%d",a[0]); printf("%d",b[0]); if(x%2==0) { for(i=1;i { printf("%d",a[i]); printf("%d",b[i]); } } else//当处理的数是奇数时 { for(i=1;i { printf("%d",a[i]); printf("%d",b[i]); } printf("%d",a[x/2]); } printf("\n"); system("pause"); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- qsort 及其 用法