sort(s.begin(),s.end(),less)
第三個(gè)參數(shù)可以不寫,默認(rèn)是升序瓶颠。也可以用函數(shù)指針或者函數(shù)對(duì)象指定,接受兩個(gè)參數(shù)和bool型返回值粹淋。
如果你比較的不是內(nèi)建類型而是自定義的類型時(shí),你需要自己寫第三個(gè)函數(shù)桃移,或者,為自定義類型重載<操作符借杰,你應(yīng)該能想得到,sort函數(shù)體里一定會(huì)用到比較大小的蔗衡。
sort()對(duì)于vector ,deque,list是適用的,因?yàn)樗鼈兊牡魇请S機(jī)的迭代器绞惦。但是不能用于關(guān)聯(lián)式容器,因?yàn)樗鼈兪怯脴湫谓Y(jié)構(gòu)逼纸,一直是有序的济蝉。它們的迭代器不是隨機(jī)迭代器菠发。
sort()有對(duì)應(yīng)的stable_sort(),穩(wěn)定排序贺嫂,也就是相同性質(zhì)的元素不改變順序。另一個(gè)有穩(wěn)定算法的是patrition和stable_partition()涝婉,但是它的意義更傾向于“分類”。
partition(s.begin(),s.end(),less_than)
這里的less_than可以是一個(gè)參數(shù)墩弯,比如
bool less_than(int a){return a< 0;}
就是將小于0和大于0 的所有數(shù)分成兩部分。而各自部分的數(shù)是沒有排序的渔工。
也可以是兩個(gè)參數(shù),兩個(gè)參數(shù)的話通常都是用容器里的值互相比較引矩,
partition(s.begin(),s.begin()+5,s.end(),less_than)
找出最好的5個(gè)梁丘。剩下的沒有排旺韭。
partial_sort和partial_sort_copy,部分排序氛谜,如果你只需要知道一大堆數(shù)中最大的幾個(gè)或最小的幾個(gè)区端,那么它正合適。
partial_sort采用的堆排序(heapsort)织盼,它在任何情況下的復(fù)雜度都是n*log(n).
partial_sort(s.begin().s.begin()+3,s.end(),less);
這里的less又是兩個(gè)參數(shù)杨何,表示互相比較沥邻,得出最小的三個(gè),至于后面的數(shù)唐全,沒有排序埃跷。
partial_sort_copy(s.begin(),s.end(),s.begin(),s.begin()+5,less);
partial_sort_copy(s.begin(),s.begin()+5,s.begin(),s.end(),less);
因?yàn)槭腔ハ啾容^邮利,所以less是連個(gè)參數(shù)。
看到兩個(gè)式子里的5了么近弟?它表示只排了5個(gè)挺智,那么容器中剩下的數(shù)完全沒變祷愉,和沒比前一樣。那么比較了的5個(gè)值是哪五個(gè)呢二鳄?
前兩個(gè)參數(shù)表示比較的范圍赴涵,而第三四個(gè)參數(shù)表示存放排好數(shù)的范圍订讼。所以:
第一個(gè)表示,對(duì)所有的數(shù)排出了最小的5個(gè)欺殿,然后將這5個(gè)放到最前面寄纵,剩下的仍然是原來的值脖苏,雖然它們會(huì)有和前5個(gè)中的數(shù)重復(fù)的,但這就是copy的效果棍潘。
第二個(gè)表示恃鞋,對(duì)容器中前五個(gè)數(shù)進(jìn)行了排序亦歉,然后將這五個(gè)放到最前面,剩下的也仍然是原來的值肴楷,只要原來容器中沒有重復(fù)的值水由,那么現(xiàn)在也沒有阶祭。
還有一個(gè)nth_element。如果只想知道第幾是誰濒募,那么用它更劃算鞭盟。
nth_e.lement(s.begin().s.begin()+5,s.end(),less)
表示瑰剃,將第六小的數(shù)放到第六個(gè)的位置齿诉,前五個(gè)最小的當(dāng)然在它前面,但是相互之間沒有排好序晌姚。后面的也一樣。所以也可以這樣理解:如果參加比賽的六強(qiáng)可以晉級(jí)決賽挥唠,那么就使用它,至于誰是第一誰是第二宝磨,預(yù)賽里這是沒有意義的盅安。
因?yàn)榕判蚩偸切枰獙?duì)各個(gè)數(shù)進(jìn)行比較,它們的迭代器都需要是隨機(jī)迭代器世囊,上述sort函數(shù)對(duì)于下列容器是可用的:vector, string 株憾,deque ,普通數(shù)組嗤瞎。
list呢?它的容器自帶了sort和stable_sort函數(shù)的操作贝奇。所以只要調(diào)用就可以了。一個(gè)間接的方法是把元素拷貝到一個(gè)支持隨機(jī)訪問迭代器的容器中弃秆,然后對(duì)它應(yīng)用需要的算法。
set,map是關(guān)聯(lián)容器菠赚,不能使用脑豹,stack,queue只能取頭尾衡查,根本就不能排序瘩欺。
率由高到低(耗時(shí)由小變大):
partion
stable_partition
nth_element
partial_sort
sort
stable_sort