深入了解C 的sort和stable_sort函數(shù)
sort和stable_sort,內(nèi)部實(shí)現(xiàn)是“快速排序”,都是C 的自帶函數(shù),提供了方便又高效的排序。那么我們?cè)撊绾问褂盟鼈兡兀? sort函數(shù)的基本用法 sort函數(shù)是C 自帶的排序函數(shù),期望
sort和stable_sort,內(nèi)部實(shí)現(xiàn)是“快速排序”,都是C 的自帶函數(shù),提供了方便又高效的排序。那么我們?cè)撊绾问褂盟鼈兡兀?/p>
sort函數(shù)的基本用法
sort函數(shù)是C 自帶的排序函數(shù),期望時(shí)間復(fù)雜度是 O(nlogn),其中 n 是待排序的元素個(gè)數(shù)。要在頭文件中加上include
sort的使用方法也很簡(jiǎn)單,如果將一個(gè)區(qū)間要從小到大排:sort(區(qū)間首指針(或迭代器),區(qū)間尾指針(或迭代器))。注意這里的區(qū)間是左閉右開的,即排序的時(shí)候不會(huì)包含尾指針存儲(chǔ)的元素。
如果我們要排序的不是數(shù)組,而是別的STL容器,比如vector,它的首迭代器就是begin(),尾迭代器就是end()。正巧,所有STL容器也是左閉右開的,所以我們就可以這么寫:sort((), v.end())。
利用sort進(jìn)行自定義排序
但是,沒有任何“花里胡哨”的sort只能從小到大排序,如果我們要從大到小排序,或者更復(fù)雜,那該怎么辦呢?也很簡(jiǎn)單,你只需要寫一個(gè)cmp函數(shù)即可sort(首,尾,cmp)。這個(gè)cmp有什么用呢?你可以用它改變排序的規(guī)則。
接下來我們?cè)敿?xì)講解一下cmp函數(shù)的寫法。首先,cmp是個(gè)bool類型的函數(shù),應(yīng)包含兩個(gè)和所要排序元素同類型的參數(shù)。例如待排序的元素為int:bool cmp (int x, int y)或者自定義的結(jié)構(gòu)體student: bool cmp(student x, student y)。
定制排序規(guī)則
排序規(guī)則很關(guān)鍵,你可以想象一下,x在y的左邊,當(dāng)cmp返回true時(shí),不改變他們的順序,返回false時(shí),就將x和y交換。cmp加強(qiáng)版:如果有多個(gè)排序要求,按優(yōu)先級(jí)一個(gè)一個(gè)寫下來即可。例如我們按照“分?jǐn)?shù)從高到底,分?jǐn)?shù)一樣按名字字典序排”。
通過靈活運(yùn)用sort和stable_sort函數(shù),我們可以輕松實(shí)現(xiàn)各種不同規(guī)則下的排序需求,提高代碼的效率和可讀性,為C 編程帶來更多便利。