您的位置 首页 > 雕刻工具

qsort,sort和qsort排序

大家好,今天小编来为大家解答qsort这个问题,sort和qsort排序很多人还不知道,现在让我们一起来看看吧!

要使用此函数只需用#include<algorithm>sort即可使用,语法描述为:

sort(begin,end),表示一个范围,例如:

int_tmain(intargc,_TCHAR*argv[])\n{\ninta[20]={2,4,1,23,5,76,0,43,24,65},i;\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nsort(a,a+20);\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nreturn0;\n}

输出结果将是把数组a按升序排序,说到这里可能就有人会问怎么样用它降序排列呢?这就是下一个讨论的内容.

一种是自己编写一个比较函数来实现,接着调用三个参数的sort:sort(begin,end,compare)就成了。对于list容器,这个方法也适用,把compare作为sort的参数就可以了,即:sort(compare).

boolcompare(inta,intb)\n{\nreturna<b;//升序排列,如果改为returna>b,则为降序\n\n}\n\nint_tmain(intargc,_TCHAR*argv[])\n{\ninta[20]={2,4,1,23,5,76,0,43,24,65},i;\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nsort(a,a+20,compare);\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nreturn0;\n}

2)更进一步,让这种操作更加能适应变化。也就是说,能给比较函数一个参数,用来指示是按升序还是按降序排,这回轮到函数对象出场了。

为了描述方便,我先定义一个枚举类型EnumComp用来表示升序和降序。很简单:

然后开始用一个类来描述这个函数对象。它会根据它的参数来决定是采用“<”还是“>”。

classcompare\n{\nprivate:\nEnumcompcomp;\npublic:\ncompare(Enumcompc):comp(c){};\nbooloperator()(intnum1,intnum2)\n{\nswitch(comp)\n{\ncaseASC:\nreturnnum1<num2;\ncaseDESC:\nreturnnum1>num2;\n}\n}\n};

接下来使用sort(begin,end,compare(ASC)实现升序,sort(begin,end,compare(DESC)实现降序。

intmain()\n{\ninta[20]={2,4,1,23,5,76,0,43,24,65},i;\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nsort(a,a+20,compare(DESC));\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nreturn0;\n}

3)其实对于这么简单的任务(类型支持“<”、“>”等比较运算符),完全没必要自己写一个类出来。标准库里已经有现成的了,就在functional里,include进来就行了。functional提供了一堆基于模板的比较函数对象。它们是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。对于这个问题来说,greater和less就足够了,直接拿过来用:

int_tmain(intargc,_TCHAR*argv[])\n{\ninta[20]={2,4,1,23,5,76,0,43,24,65},i;\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nsort(a,a+20,greater<int>());\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nreturn0;\n}

4)既然有迭代器,如果是string就可以使用反向迭代器来完成逆序排列,程序如下:

intmain()\n{\nstringstr("cvicses");\nstrings(str.rbegin(),str.rend());\ncout<<s<<endl;\nreturn0;\n}

qsort():

原型:_CRTIMPvoid__cdeclqsort(void*,size_t,size_t,int(*)(constvoid*,constvoid*));解释:qsort(数组名,元素个数,元素占用的空间(sizeof),比较函数)比较函数是一个自己写的函数遵循intcom(constvoid*a,constvoid*b)的格式。当ab关系为><=时,分别返回正值负值零(或者相反)。使用ab时要强制转换类型,从void*转换回应有的类型后,进行操作。数组下标从零开始,个数为N,下标0-(n-1)。

实例:intcompare(constvoid*a,constvoid*b)

{\nreturn*(int*)b-*(int*)a;\n}\n\nintmain()\n{\ninta[20]={2,4,1,23,5,76,0,43,24,65},i;\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nqsort((void*)a,20,sizeof(int),compare);\nfor(i=0;i<20;i++)\ncout<<a[i]<<endl;\nreturn0;\n}

sort中几种常见的cmp函数:

一、对int类型数组排序

#include<cstdio>\n#include<cstring>\n#include<algorithm>\nusingnamespacestd;\n\nintcmp(inta,intb){//compare调用\n\treturna>b;\n}\nintmain()\n{\n\tintn;\n\tinta[10];\n\tscanf("%d",&n);\n\tfor(inti=0;i<n;++i)\n\t\tscanf("%d",&a[i]);\n\tsort(a,a+n,cmp);//(首地址,长度,cmp调用)\n\tfor(inti=0;i<n;++i)\n\t\tprintf("%d",a[i]);\n\t\n\treturn0;\n}

二、对char类型数组排序(同int类型)

#include<cstdio>\n#include<cstring>\n#include<algorithm>\nusingnamespacestd;\nintcmp(chara,charb)//cmp调用\n{\n\treturna>b;\n}\nintmain()\n{\n\tchara[10];\n\tscanf("%s",a);\n\tsort(a,a+3,cmp);//(首地址,长度,cmp调用)\n\tprintf("%s\\n",a);\n\treturn0;\n}

三、对double类型数组排序

从小到大!sort(a,a+3);//直接sort(首地址,长度)即可!下面就拿double型进行示范:

<spanstyle="color:#800080;">#include<cstdio>\n#include<cstring>\n#include<algorithm>\nusingnamespacestd;\nintmain()\n{\n\tintn;\n\tdoublea[10];\n\tscanf("%d",&n);\n\tfor(inti=0;i<n;++i)\n\t\tscanf("%lf",&a[i]);\n\t</span><spanstyle="color:#ff0000;">sort(a,a+n);//《sort(首地址,长度)》</span><spanstyle="color:#800080;">\n\tfor(inti=0;i<n;++i)\n\t\tprintf("%lf",a[i]);\n\treturn0;\n}</span>

四、对结构体一级排序

#include<cstdio>\n#include<cstring>\n#include<algorithm>\nusingnamespacestd;\nstructnode{\n\tchara[20];\n};\ncharstr[100][1010];\nintcmp(chara,charb)\n{\n\treturnstrcmp(a,b);\n}\nintmain()\n{\n\tintn;\n\tscanf("%d",&n);\n\tfor(inti=0;i<n;++i)\n\t\tscanf("%s",str[i]);\n\tsort(str,str+n,cmp);\n\tfor(inti=0;i<n;++i)\n\t\tprintf("%s",str[i]);\n\treturn0;\n}

//这里排的是字符串型,Int,double都一样

int型:(char,double型类似)\nstructnode\n{\n\tinta;\n}\nintcmp(inta,intb)\n{\n\treturna<b;\n}

五、对结构体二级排序

#include<stdio.h>\n#include<algorithm>\nusingnamespacestd;\nstructnode\n{\n\tinta;\n\tintb;\n}num[10];\nintcmp(nodex,nodey)//如果结构体中a相等,则按b排序,否则按a排序\n{\n\tif(x.a==y.a)\n\treturnx.b<y.b;\n\treturnx.a<y.a;\n}\nintmain()\n{\n\tinti,j;\n\tfor(i=0;i<10;i++)\n\t{\n\t\tscanf("%d%d",&num[i].a,&num[i].b);\n\t}\n\tsort(num,num+10,cmp);\n\tfor(i=0;i<10;i++)\n\t{\n\t\tprintf("%d%d",num[i].a,num[i].b);\n\t}\n\treturn0;\n}

下面是Qsort:

一、对int类型数组排序

#include<stdio.h>\n#include<stdlib.h>\nintcmp(constvoid*a,constvoid*b)<spanstyle="font-family:verdana,arial,helvetica,sans-serif;">//按照这种模式写即可</span>\n{\n\treturn*(int*)b-*(int*)a;//按照这种模式写即可\n}\nintmain()\n{\n\tintn;\n\tinta[1010];\n\tscanf("%d",&n);\n\tfor(inti=0;i<n;i++)\n\t{\n\t\tscanf("%d",&a[i]);\n\t}\n\tqsort(a,n,sizeof(a[0]),cmp);//(首地址,长度,sizeof(a[0]),cmp)\n\tfor(i=0;i<n;i++)\n\t{\n\t\tprintf("%d",a[i]);\n\t}\n\tprintf("\\n");\n\treturn0;\n}

</pre><p></p><p><spanstyle="color:rgb(128,0,128);font-family:verdana,arial,helvetica,sans-serif;font-size:13px;line-height:19.5px;">二、对double类型数组排序(特别要注意符号反方向)</span></p><p><spanstyle="color:rgb(128,0,128);font-family:verdana,arial,helvetica,sans-serif;font-size:13px;line-height:19.5px;"></span><prename="code"class="cpp">#include<stdio.h>\n#include<stdlib.h>\nintcmp(constvoid*a,constvoid*b)\n{\n\treturn*(double*)a>*(double*)b;//与sort的大于小于号,相反\n}\nintmain()\n{\n\tdoublea[1010];\n\tintn,i;\n\tscanf("%d",&n);\n\tfor(i=0;i<n;i++)\n\t{\n\t\tscanf("%lf",&a[i]);\n\t}\n\tqsort(a,n,sizeof(a[0]),cmp);\n\tfor(i=0;i<n;i++)\n\t{\n\t\tprintf("%lf",a[i]);\n\t}\n\tprintf("\\n");\n}

三、对char类型数组排序(同double类型)

#include<stdio.h>\n#include<stdlib.h>\nintcmp(constvoid*a,constvoid*b)\n{\n\treturn*(char*)a>*(char*)b;//与sort的大于小于号,相反\n}\nintmain()\n{\n\tdoublea[1010];\n\tintn,i;\n\tscanf("%d",&n);\n\tgetchar();\n\tfor(i=0;i<n;i++)\n\t{\n\t\tscanf("%c",&a[i]);\n\t\t\tgetchar();\n\t}\n\tqsort(a,n,sizeof(a[0]),cmp);\n\n\tfor(i=0;i<n;i++)\n\t{\n\t\tprintf("%c",a[i]);\n\t}\n\tprintf("\\n");\n}

四、对结构体一级排序(把一级排序去掉,注释去掉,就是二级排序)

#include<stdio.h>\n#include<stdlib.h>\n#include<string.h>\nstructnode\n{\n\tintu,w;\n\tdoublev;\n\tcharstr[1010];\n}b[1010];\nintcmp(constvoid*a,constvoid*b)\n{\n\treturnstrcmp((*(node*)a).str,(*(node*)b).str);\n//\tif((*(node*)a).u==(*(node*)b).u)\n//\t\treturn(*(node*)b).w-(*(node*)a).w;\n//\treturn(*(node*)a).u-(*(node*)b).u;\n}\nintmain()\n{\n\tintn,i;\n\tscanf("%d",&n);\n\tfor(i=0;i<n;i++)\n\t{\n\t\tscanf("%d%d",&b[i].u,&b[i].w);\n\t}\n\tqsort(b,n,sizeof(b[0]),cmp);\n\tfor(i=0;i<n;i++)\n\t{\n\t\tprintf("%d%d\\n",b[i].u,b[i].w);\n\t}\n}

最后,Qsort与sort不同的是:Qsort能排字符串!!

#include<stdio.h>\n#include<stdlib.h>\n#include<string.h>\ncharstr[100][1010];\nintcmp(constvoid*a,constvoid*b)\n{\n\treturnstrcmp((char*)b,(char*)a);\n}\nintmain()\n{\n\tintn,i;\n\tscanf("%d",&n);\n\tfor(i=0;i<n;i++)\n\t{\n\t\tscanf("%s",str[i]);\n\t}\n\tqsort(str,n,sizeof(str[0]),cmp);\n\tfor(i=0;i<n;i++)\n\t{\n\t\tprintf("%s\\n",str[i]);\n\t}\n\treturn0;\n}sort和qsoort比较:

1.cmp函数和qsort中cmp函数的不同

2.sort函数是c++中标准模板库的的函数,在qsort()上已经进行了优化,根据情况的不同可以采用不同的算法,所以较快。在同样的元素较多和同样的比较条件下,sort()的执行速度都比qsort()要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。使用时需调用<algorithm>

sort(begin(),end(),cmp),

文章到此结束,如果本次分享的qsort和sort和qsort排序的问题解决了您的问题,那么我们由衷的感到高兴!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023