大家好,今天小编来为大家解答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排序的问题解决了您的问题,那么我们由衷的感到高兴!