sort()函數(shù)與qsort()函數(shù)及其頭文件_第1頁(yè)
sort()函數(shù)與qsort()函數(shù)及其頭文件_第2頁(yè)
sort()函數(shù)與qsort()函數(shù)及其頭文件_第3頁(yè)
sort()函數(shù)與qsort()函數(shù)及其頭文件_第4頁(yè)
sort()函數(shù)與qsort()函數(shù)及其頭文件_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、sort。函數(shù)是C+中的排序函數(shù)其頭文件為:#mclude頭文件;qsort()是C中的排序函數(shù),其頭文件為:#iiiclude1、qsort()六類(lèi)qsort排序方法qsort函數(shù)很好用,但有時(shí)不太會(huì)用比如按結(jié)構(gòu)體一級(jí)排序、二級(jí)排序、字符串排序等。函數(shù)原型:voidqsort(void*base,size_tnelem,size_twidth,int(*fcmp)(constvoid*,constvoid*)輸入?yún)?shù):Base:待排序的數(shù)組nelem:數(shù)組元數(shù)的個(gè)數(shù)(長(zhǎng)度)width:每一個(gè)元素所占存儲(chǔ)空間的大小fcmp:用于對(duì)數(shù)組元素進(jìn)行比較的函數(shù)的指針(該函數(shù)是要自己寫(xiě)的),返回值為1或

2、-1(plp2則返回-1,pl*(Element_type*)p1)?1:-1;mtElemenCelistMAX;lnitial(list);/這是對(duì)數(shù)組listmax初始化qsort(list,sizeof(list),sizeof(Element_type),Comp);/調(diào)用函數(shù)qsortreturn0;對(duì)字符串排序:mtComp(constvoid*pl,constvoid*p2)returnstrcmp(chai*)p2,(charmtcliaiaMAXlMAX2;initial(a);qsort(a,lentil,sizeof(a0),Comp);/lenth為數(shù)組a的長(zhǎng)度按結(jié)構(gòu)

3、體中某個(gè)關(guān)鍵字排序(對(duì)結(jié)構(gòu)體一級(jí)排序:stmctNodedoubledata;intother;s100;mtComp(constvoid*pl,constvoid*p2)return(*(Node*)p2)-data(*(Node*)pl)-data?1:-1;qsort(s,100,sizeof(s0),Comp);按結(jié)構(gòu)體中多個(gè)關(guān)鍵字排序(對(duì)結(jié)構(gòu)體多級(jí)排序)以二級(jí)為例:stmctNodeintx;intv;s100;按照x從小到人排序,當(dāng)x相等時(shí)按y從人到小排序(這是3跟4的區(qū)別)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;對(duì)結(jié)構(gòu)體中字符串進(jìn)行排序:stmctNodeintdata;chaistr100;s100;按照結(jié)構(gòu)體中字符串str的字典序排序mtComp(constvoid*pl,constvoid*p2)retuinstrcmp(*(Node*)pl).sti(*(Node*)p2).str);qsort(s,100,sizeof(s0,Comp);計(jì)算幾何中求凸包的CompmtComp(constvoid*pl,constvoid*p2)重點(diǎn)Comp函數(shù),把除了1點(diǎn)外的

5、所有的點(diǎn)旋轉(zhuǎn)角度排序stmctpomt*c=(pomt*)pl;stmctpoint*d=(pomt*)p2;if(cacl(*c,*d,pl)%dy,plx,ply)如果在一條直線(xiàn)上,則把遠(yuǎn)的放在前面return1;elsereturn-1;2、sort()son對(duì)給定區(qū)間所有元素進(jìn)行排序stable_son對(duì)給定區(qū)間所有元素進(jìn)行穩(wěn)定排序panial_soil對(duì)給定區(qū)間所有元素部分排序partial_soit_copy對(duì)給定區(qū)間復(fù)制并排序nth.element找出給定區(qū)間的某個(gè)位置對(duì)應(yīng)的元素is_sorted判斷一個(gè)區(qū)間是否已經(jīng)排好序panition使得符合某個(gè)條件的元素放在前面stable

6、_panition相對(duì)穩(wěn)定的使得符合某個(gè)條件的元素放在前面語(yǔ)法描述為:sort(begin,end),表示一個(gè)范圍,例如: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;輸出結(jié)果將是把數(shù)組a按升序排序,說(shuō)到這里可能就有人會(huì)問(wèn)怎么樣用它降序排列呢?這就是下一個(gè)討論的內(nèi)容。sort(begm,end,compare)一種是自己編寫(xiě)一個(gè)比較函數(shù)來(lái)實(shí)現(xiàn),接著調(diào)用三個(gè)參數(shù)的

7、sort:sort(begin,end,compare)就成了。對(duì)于list容器,這個(gè)方法也適用,把compare作為sort的參數(shù)就可以了,即:sort(compare)。自己編寫(xiě)compare函數(shù):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;更進(jìn)一步,讓這種操作更加能適應(yīng)變化。也就是說(shuō),能給比較函

8、數(shù)一個(gè)參數(shù),用來(lái)指示是按升序還是按降序排,這回輪到函數(shù)對(duì)象出場(chǎng)了。為了描述方便,我先定義一個(gè)枚舉類(lèi)型EnumComp用來(lái)表示升序和降序。很簡(jiǎn)單:enumEnumcompASC,DESC;然后開(kāi)始用一個(gè)類(lèi)來(lái)描述這個(gè)函數(shù)對(duì)彖。它會(huì)根據(jù)它的參數(shù)來(lái)決定是采用還是classcompareprivate:Enumcompcomp;public:compare(Enumcompc):comp(c);booloperator()(mtnumljntnuni2)switch(comp)caseASC:returnnum1nuni2;接卜來(lái)使用sort(beguhend,compare(ASC)實(shí)現(xiàn)升序,sort

9、(begin,end,compare(DESC)實(shí)現(xiàn)降序。主函數(shù)為: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;其實(shí)對(duì)于這么簡(jiǎn)單的任務(wù)(類(lèi)型支持“”、“”等比較運(yùn)算符),完全沒(méi)必要自己寫(xiě)一個(gè)類(lèi)出來(lái)。標(biāo)準(zhǔn)庫(kù)里已經(jīng)有現(xiàn)成的了,就在fiinctional里,include進(jìn)來(lái)就行了。fiinctional提供了一堆基于模板的比較函數(shù)對(duì)彖。它們是(看名字就知道意思了):equal_to.not

10、_equal_togreatergieater_equalsless、less_equalo對(duì)于這個(gè)問(wèn)題來(lái)說(shuō),gwa血和less就足夠了,直接拿過(guò)來(lái)用:升序: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就可以使用反向迭代器來(lái)完成逆序排列,程序如下:mt

11、mam()stringstr(McvicsesH);strings(str.rbeginO,str.rendO);coutsendl;return0;這是我在百度上找到的1011題的答案,我覺(jué)得用它來(lái)說(shuō)明sort。函數(shù)最具有代表性#include#include#include#includeusingnamespacestd;intstick100,n;boolused100;/unused:沒(méi)有使用的棍子的數(shù)目/left:剩下的長(zhǎng)度len:當(dāng)前認(rèn)為的計(jì)算的長(zhǎng)度booldfs(mtunused,intleft,intlen)/所有的棍子已經(jīng)用了,且沒(méi)有剩余的長(zhǎng)度,符合搜索條件if(unuse

12、d=0&hft=0)returntine;inti;沒(méi)有剩下的則新開(kāi)一條棍子if(left=0)left=len;尋找沒(méi)有使用過(guò)的棍子for(i=0;in;+i)找到?jīng)]有用過(guò)的,而且長(zhǎng)度比left值要小(能夠填進(jìn)去)if(!used&stick=left)/使用當(dāng)前棍子used=tme;若在當(dāng)前情況下能夠擴(kuò)展出正確答案,則返回if(dfs(unused-l,left-stick,len)成功搜索,返回returntine;否則不使用當(dāng)前的棍子used=false;若使用stick不能擴(kuò)展出正確結(jié)果,那么如果stick與left等長(zhǎng),則證明len不可能是正確答案若left與len等長(zhǎng),就是沒(méi)有辦法擴(kuò)展if(stick=left|left=len)break;/經(jīng)過(guò)一輪搜索仍得不到正確答案,則返回falsereturnfalse;mtmam()inti,sum;while(scanf(n%dM,&n)!=EOF&n)sum=0;for

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論