函數(shù)聲明:
? ??template< classRandomIt>
? ? ?voidsort(RandomItfirst,RandomItlast);
?????template< classRandomIt,classCompare>
? ? voidsort(RandomItfirst,RandomItlast,Comparecomp);
STL提供了兩種調(diào)用方式,一種使用默認(rèn)的 < 操作符价匠,一種是可以自己定義比較函數(shù)赡模。
實(shí)現(xiàn)原理:
????STL中sort? ? 內(nèi)部使用三種排序方式琳彩,分別是 快排顶别,堆排序 和插入排序,根據(jù)不同的數(shù)量級(jí)別自動(dòng)選擇合適的排序方法:數(shù)據(jù)量較大的時(shí)候膀估,采用快速排序撰豺,分段遞歸。一旦分段后數(shù)據(jù)量小于某個(gè)閥值有决,改用插入排序闸拿。為避免遞歸調(diào)用帶來(lái)的額外負(fù)荷,遞歸到達(dá)一定層次采用堆排序书幕。
源碼:
sort直接調(diào)用的是內(nèi)省循環(huán)函數(shù)? ?(__introsort_loop),?
? ? 1.首先判讀__stl_threshold這個(gè)值新荤,__stl_threshold是一個(gè)常整型全局變量,值16台汇,也就是說(shuō)如果數(shù)量級(jí)少于16苛骨,則不會(huì)進(jìn)行快排篱瞎,返回上一層。進(jìn)而進(jìn)行插入排序痒芝。
????2.如果元素大于__stl_threshold俐筋,則判斷遞歸調(diào)用深度是否超過(guò)限制,严衬,如果達(dá)到最大層次的限制澄者,改用堆排序partial_sort();
????3.如果沒(méi)有超過(guò)遞歸調(diào)用深度请琳,調(diào)用__unguarded_partition(),對(duì)當(dāng)前元素做一趟快速排序粱挡,返回樞紐位置。
????4.經(jīng)過(guò)一次快排俄精,在遞歸對(duì)右半部分進(jìn)行內(nèi)省排序算法抱怔,然后回到while循環(huán),對(duì)左半部分進(jìn)行排序嘀倒。