詳解C++ sort函數(shù)的cmp參數(shù)
前言:
學(xué)算法的第一天你在學(xué)冒泡、桶排
在你還沒(méi)搞明白快排和歸并的時(shí)候
你已經(jīng)學(xué)到了數(shù)據(jù)結(jié)構(gòu)最后的堆排序和希爾排序
可以說(shuō)排序是很多競(jìng)賽生的噩夢(mèng)……
于是它誕生了
void std::sort() Sort the elements of a sequence using a predicate for comparison. 參數(shù): __first – An iterator. __last – Another iterator. __comp – A comparison functor.
針對(duì)一個(gè)地址區(qū)間完成排序,算法每次自動(dòng)選擇,以快排為主
C++需要頭文件#include <algorithm> (當(dāng)然萬(wàn)能頭我也沒(méi)意見(jiàn))
1、升序排序
最簡(jiǎn)單的就是用它完成int類(lèi)型升序排序
Copy Line-numbers language-cpp
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a[5] = {2, 1, 3, 5, 4};
sort(a, a + 5);
for (int i = 0; i < 5; i++) cout << a[i] << " ";
}
輸出如下,很簡(jiǎn)單
1 2 3 4 5
這里傳入給sort的參數(shù) a 和 a + 5 都是地址,和大多數(shù)編程語(yǔ)言一樣,這里遵循左閉右開(kāi)原則,即函數(shù)實(shí)際會(huì)讀取和操作的五個(gè)地址如下:
a + 0 a + 1 a + 2 a + 3 a + 4
2、降序排序
如果需要降序排序,程序如下
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int x, int y){
return x > y;
}
int main() {
int a[5] = {2, 1, 3, 5, 4};
sort(a, a + 5, cmp);
for (int i = 0; i < 5; i++) cout << a[i] << " ";
}
輸出:
5 4 3 2 1
我們多寫(xiě)了一個(gè)bool類(lèi)型的cmp函數(shù),并將其地址作為第3個(gè)參數(shù)傳給了sort
cmp可以替換其內(nèi)置的函數(shù)來(lái)判斷究竟該讓哪些元素在前哪些元素在后
很多小伙伴可能有個(gè)疑惑:如何從實(shí)質(zhì)上理解cmp函數(shù),或者說(shuō)我究竟該怎么記住cmp怎么寫(xiě)呢?
我們來(lái)看這三個(gè)點(diǎn):
- 毋庸置疑,cmp函數(shù)返回bool類(lèi)型,表示當(dāng)前排序是否正確(具體見(jiàn)3)
- cmp函數(shù)應(yīng)接受兩個(gè)參數(shù),類(lèi)型與要排序的數(shù)組相同(可以是int、short和long long這些常見(jiàn)類(lèi)型,當(dāng)然也可以是結(jié)構(gòu)體)
cmp返回值的實(shí)際意義是傳入a、b兩個(gè)參數(shù),a在前b在后的排序是否是正確的,若是正確的返回1(true),否則返回0(false)
那么我們?cè)倏匆粋€(gè)結(jié)構(gòu)體的排序?qū)嵗?/p>
3、結(jié)構(gòu)體的排序?qū)嵗?/h2>
結(jié)構(gòu)體的排序?qū)嵗狠斎?0個(gè)學(xué)生的名字和成績(jī),按照成績(jī)從高到低排序后輸出
輸入數(shù)據(jù):
Yixiangzhilv 90 Mydr 60 Xiaoming 10 Mr.Glass 60 GZN 80 Wangzi 85 Hyx 100 Wyx 99 Xth 0 Zz 75
程序?qū)崿F(xiàn)如下:
#include <algorithm>
#include <iostream>
using namespace std;
struct node {
string name;
int score;
};
bool cmp(struct node x, struct node y) {
return x.score > y.score;
}
int main() {
struct node a[10];
for (int i = 0; i < 10; i++) cin >> a[i].name >> a[i].score;
sort(a, a + 10, cmp);
for (int i = 0; i < 10; i++) cout << a[i].name << " " << a[i].score << endl;
}
(此處還有一個(gè)C++知識(shí):如果已經(jīng)定義結(jié)構(gòu)體node,那么 struct node a[10]; 和 node a[10]; 都是合法的)
以上就是詳解C++ sort函數(shù)的cmp參數(shù)的詳細(xì)內(nèi)容,更多關(guān)于C++ sort函數(shù)的cmp參數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章,希望大家以后多多支持腳本之家
相關(guān)文章
C語(yǔ)言用遞歸函數(shù)對(duì)素?cái)?shù)進(jìn)行判斷流程
素?cái)?shù)判斷是編程語(yǔ)言學(xué)習(xí)過(guò)程中一個(gè)老生常談的話題,而它的實(shí)現(xiàn)也有多種算法,包括經(jīng)典的試除法(以及試除法的幾種優(yōu)化),進(jìn)階的素?cái)?shù)表篩選法,埃拉托斯特尼篩法和歐拉篩法(以及它們的優(yōu)化)等。對(duì)以上算法感興趣的朋友們,不妨搜索“素?cái)?shù)判斷的N種境界”來(lái)學(xué)習(xí)了解2022-09-09
深入探討Linux靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的詳解(一看就懂)
本篇文章是對(duì)Linux靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
QT5多窗口跳轉(zhuǎn)實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了使用Qt5實(shí)現(xiàn)多窗口界面跳轉(zhuǎn)的過(guò)程,包括創(chuàng)建多個(gè)UI界面、設(shè)計(jì)按鈕連接槽函數(shù)以及實(shí)現(xiàn)界面之間的導(dǎo)航,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易的掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易的掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Cocos2d-x人物動(dòng)作類(lèi)實(shí)例
這篇文章主要介紹了Cocos2d-x人物動(dòng)作類(lèi)實(shí)例,本文用大量代碼和圖片講解Cocos2d-x中的動(dòng)作,代碼中同時(shí)包含大量注釋說(shuō)明,需要的朋友可以參考下2014-09-09

