sort()函数与qsort()函数及其头文件_第1页
sort()函数与qsort()函数及其头文件_第2页
sort()函数与qsort()函数及其头文件_第3页
sort()函数与qsort()函数及其头文件_第4页
sort()函数与qsort()函数及其头文件_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、sort。函数是C+中的排序函数其头文件为:#mclude头文件;qsort()是C中的排序函数,其头文件为:#iiiclude1、qsort()六类qsort排序方法qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等。函数原型:voidqsort(void*base,size_tnelem,size_twidth,int(*fcmp)(constvoid*,constvoid*)输入参数:Base:待排序的数组nelem:数组元数的个数(长度)width:每一个元素所占存储空间的大小fcmp:用于对数组元素进行比较的函数的指针(该函数是要自己写的),返回值为1或

2、-1(plp2则返回-1,pl*(Element_type*)p1)?1:-1;mtElemenCelistMAX;lnitial(list);/这是对数组listmax初始化qsort(list,sizeof(list),sizeof(Element_type),Comp);/调用函数qsortreturn0;对字符串排序:mtComp(constvoid*pl,constvoid*p2)returnstrcmp(chai*)p2,(charmtcliaiaMAXlMAX2;initial(a);qsort(a,lentil,sizeof(a0),Comp);/lenth为数组a的长度按结构

3、体中某个关键字排序(对结构体一级排序:stmctNodedoubledata;intother;s100;mtComp(constvoid*pl,constvoid*p2)return(*(Node*)p2)-data(*(Node*)pl)-data?1:-1;qsort(s,100,sizeof(s0),Comp);按结构体中多个关键字排序(对结构体多级排序)以二级为例:stmctNodeintx;intv;s100;按照x从小到人排序,当x相等时按y从人到小排序(这是3跟4的区别)mtComp(constvoid*pl,constvoid*p2)stmctNode*c=(Node*)pl

4、;stmctNode*d=(Node*)p2;if(c-x!=d-x)returnc-x-d-x;elsereturnd-v-c-y;对结构体中字符串进行排序:stmctNodeintdata;chaistr100;s100;按照结构体中字符串str的字典序排序mtComp(constvoid*pl,constvoid*p2)retuinstrcmp(*(Node*)pl).sti(*(Node*)p2).str);qsort(s,100,sizeof(s0,Comp);计算几何中求凸包的CompmtComp(constvoid*pl,constvoid*p2)重点Comp函数,把除了1点外的

5、所有的点旋转角度排序stmctpomt*c=(pomt*)pl;stmctpoint*d=(pomt*)p2;if(cacl(*c,*d,pl)%dy,plx,ply)如果在一条直线上,则把远的放在前面return1;elsereturn-1;2、sort()son对给定区间所有元素进行排序stable_son对给定区间所有元素进行稳定排序panial_soil对给定区间所有元素部分排序partial_soit_copy对给定区间复制并排序nth.element找出给定区间的某个位置对应的元素is_sorted判断一个区间是否已经排好序panition使得符合某个条件的元素放在前面stable

6、_panition相对稳定的使得符合某个条件的元素放在前面语法描述为:sort(begin,end),表示一个范围,例如:mt_tmain(iiitaigc,_TCHAR*argv)inta20=2,4,l,23,5,76,0,43,24,65,i;fbr(i=0;i20;i-H-)coutaiendl;sort(a,a+20);fbr(i=0;i20;i-H-)coutaiendl;retuni0;输出结果将是把数组a按升序排序,说到这里可能就有人会问怎么样用它降序排列呢?这就是下一个讨论的内容。sort(begm,end,compare)一种是自己编写一个比较函数来实现,接着调用三个参数的

7、sort:sort(begin,end,compare)就成了。对于list容器,这个方法也适用,把compare作为sort的参数就可以了,即:sort(compare)。自己编写compare函数:boolconipare(intajntb)returnab,则为降序iiitaigc,_TCHAR*argv)inta20=2,4,1,23,5,76,0,43,24,65,i;fbi(i=0;i20;i+)coutaiendl;sort(a.a+20,compaie);fbr(i=0;i20;i+)coutaiendl:return0;更进一步,让这种操作更加能适应变化。也就是说,能给比较函

8、数一个参数,用来指示是按升序还是按降序排,这回轮到函数对象出场了。为了描述方便,我先定义一个枚举类型EnumComp用来表示升序和降序。很简单:enumEnumcompASC,DESC;然后开始用一个类来描述这个函数对彖。它会根据它的参数来决定是采用还是classcompareprivate:Enumcompcomp;public:compare(Enumcompc):comp(c);booloperator()(mtnumljntnuni2)switch(comp)caseASC:returnnum1nuni2;接卜来使用sort(beguhend,compare(ASC)实现升序,sort

9、(begin,end,compare(DESC)实现降序。主函数为:iiitmam()inta20=2,4,1,23,5,76,0,43,24,65);foi(i=0;i20;i+)coutaiendl;sort(a.a+20,compaie(DESC);foi(i=0;i20;i+)coutaiendl;return0;其实对于这么简单的任务(类型支持“”、“”等比较运算符),完全没必要自己写一个类出来。标准库里已经有现成的了,就在fiinctional里,include进来就行了。fiinctional提供了一堆基于模板的比较函数对彖。它们是(看名字就知道意思了):equal_to.not

10、_equal_togreatergieater_equalsless、less_equalo对于这个问题来说,gwa血和less就足够了,直接拿过来用:升序:sort(begm.enddess();降序:sort(begm.end,greater().mtaigc,_TCHAR*argv)inta20F2,4,1,23,5,76,0,43,24,65);foi(i=0;i20;i+)coutaiendl;sort(a.a+20,greater();foi(i=0;i20;i+)coutaiendl;return0;既然有迭代器,如果是stnng就可以使用反向迭代器来完成逆序排列,程序如下:mt

11、mam()stringstr(McvicsesH);strings(str.rbeginO,str.rendO);coutsendl;return0;这是我在百度上找到的1011题的答案,我觉得用它来说明sort。函数最具有代表性#include#include#include#includeusingnamespacestd;intstick100,n;boolused100;/unused:没有使用的棍子的数目/left:剩下的长度len:当前认为的计算的长度booldfs(mtunused,intleft,intlen)/所有的棍子已经用了,且没有剩余的长度,符合搜索条件if(unuse

12、d=0&hft=0)returntine;inti;没有剩下的则新开一条棍子if(left=0)left=len;寻找没有使用过的棍子for(i=0;in;+i)找到没有用过的,而且长度比left值要小(能够填进去)if(!used&stick=left)/使用当前棍子used=tme;若在当前情况下能够扩展出正确答案,则返回if(dfs(unused-l,left-stick,len)成功搜索,返回returntine;否则不使用当前的棍子used=false;若使用stick不能扩展出正确结果,那么如果stick与left等长,则证明len不可能是正确答案若left与len等长,就是没有办法扩展if(stick=left|left=len)break;/经过一轮搜索仍得不到正确答案,则返回falsereturnfalse;mtmam()inti,sum;while(scanf(n%dM,&n)!=EOF&n)sum=0;for

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论