<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
sort函數是algorithm庫下的一個函數,sort函數是不穩定的,即大小相同的元素在排序後相對順序可能發生改變,如果某些場景需要保持相同元素間的相對順序,可使用stable_sort
函數,這裡不過多介紹。
預設: 兩個引數first
,last
,將[first, last)
區間內元素升序排列。【注意區間為左閉右開】
自定義排序: 需使用者指定排序規則Compare comp
,將 [first, last)
區間內的元素按照使用者指定的順序排列。
由於在排序過程中涉及到元素交換等操作,所以sort函數僅支援可隨機存取的容器,如陣列, string、vector、deque等。
sort()
並非只是普通的快速排序,除了對普通的快速排序進行優化,它還結合了插入排序和堆排序。根據不同的數量級別以及不同情況,能自動選用合適的排序方法。當資料量較大時採用快速排序,分段遞迴。一旦分段後的資料量小於某個閥值,為避免遞迴呼叫帶來過大的額外負荷,便會改用插入排序。而如果遞迴層次過深,有出現最壞情況的傾向,還會改用堆排序。
所以無論元素初始時為何種狀態,sort()
的平均排序複雜度為均為O(N*log2(N)) ,具有不錯的的效能,在刷演演算法題時,可以直接使用sort()來對資料進行排序,而不需手動編寫排序函數。
sort函數如果不傳入第三個引數,則預設是升序排列。
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { // 方式一、使用陣列 int a[10] = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0}; sort(a, a + 10); // 10為元素個數 for (int i = 0; i < 10; i++) cout << a[i] << ' '; // 輸出排序後陣列 cout << endl; // 方式二、使用 vector vector<int> arr = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0}; sort(arr.begin(), arr.end()); // 10為元素個數 for (int i = 0; i < 10; i++) cout << arr[i] << ' '; // 輸出排序後陣列 return 0; }
實現降序排列,需傳入第三個引數–比較函數,greater<type>()
,這裡的元素為int
型別,即函數為 greater<int>()
; 如果是其他基本資料型別如float
、double
、long
等也是同理。
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { // 方式一、使用陣列 int a[10] = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0}; sort(a, a + 10, greater<int>()); // 10為元素個數 for (int i = 0; i < 10; i++) cout << a[i] << ' '; // 輸出排序後陣列 cout << endl; // 輸出 9 8 7 6 5 4 3 2 1 0 // 方式二、使用 vector vector<int> arr = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0}; sort(arr.begin(), arr.end(), greater<int>()); for (int i = 0; i < 10; i++) cout << arr[i] << ' '; // 輸出排序後陣列 return 0; }
我們也可以使用自定義的比較函數,函數的返回值為bool
型別, 例如:
bool cmp(int num1, int num2) { return num1 > num2; // 可以簡單理解為 > 降序排列; < 升序排列 }
#include<iostream> #include<vector> #include<algorithm> using namespace std; bool cmp(int num1, int num2) { return num1 > num2; // 可以簡單理解為 >: 降序排列; < : 升序排列 } int main() { // 一、使用陣列 int a[10] = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0}; sort(a, a + 10, cmp); // 使用自定義排序函數 for (int i = 0; i < 10; i++) cout << a[i] << ' '; // 輸出排序後陣列 cout << endl; // 輸出 9 8 7 6 5 4 3 2 1 0 // 二、使用 vector vector<int> arr = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0}; sort(arr.begin(), arr.end(), cmp); // 使用自定義排序函數 for (int i = 0; i < 10; i++) cout << arr[i] << ' '; // 輸出排序後陣列 return 0; }
要對元素進行排序,前提是元素之間可以進行比較,即誰大誰小。 基本資料型別可直接進行大小比較, 但結構體元素之間的大小關係需要我們自己指定,如果不指定,則結構體之間大小關係就不確定,則不能夠排序。
結構體排序案例1: 對學生資訊進行排序
學生有姓名
,分數
兩個屬性,
struct Student { // 學生結構體 string name; // 學生姓名 int grade; // 學生分數 Student(); // 無引數建構函式 Student(string name, int grade) : name(name), grade(grade) {}; // 有引數建構函式 };
需求: 對一個班級內的學生成績進行排序,首先按成績進行排序降序排列,若成績相同,則按照姓名字典順序升序排列。
自定義排序函數;
bool cmp(Student s1, Student s2) { // 自定義排序 if (s1.grade != s2.grade) { // 如果學生成績不相同 return s1.grade > s2.grade; // 則按照成績降序排列 } return s1.name < s2.name; // 否則按照姓名升序排列 }
排序程式碼:
#include<iostream> #include<vector> #include<algorithm> using namespace std; struct Student { // 學生結構體 string name; // 學生姓名 int grade; // 學生分數 Student(); // 無引數建構函式 Student(string name, int grade) : name(name), grade(grade) {}; // 有引數建構函式 }; bool cmp(Student s1, Student s2) { // 自定義排序 if (s1.grade != s2.grade) { // 如果學生成績不同 return s1.grade > s2.grade; // 則按照成績降序排列 } return s1.name < s2.name; // 否則按照姓名升序排列 } int main() { vector<Student> studs; studs.emplace_back("Bob", 80); studs.emplace_back("Ali", 90); studs.emplace_back("Ann", 85); studs.emplace_back("Liming", 90); studs.emplace_back("Trump", 79); studs.emplace_back("Fury", 58); studs.emplace_back("Jam", 62); studs.emplace_back("Lucy", 89); sort(studs.begin(), studs.end(), cmp); // 排序 for (int i = 0; i < studs.size(); i++) { // 輸出結果 cout << studs[i].name << "t" << studs[i].grade << endl; } return 0; }
bool cmp(int num1, int num2) { // 實現降序排列 return num1 > num2; // num1大於num2時返回true,否則返回false }
自定義函數返回值為bool
型別
true
,則表示num1
與num2
應該交換順序;false
, 則num1
與num2
保持原有順序;下面舉例說明自定義比較函數的執行過程:
對 2, 5, 1, 3, 4 降序排列
呼叫cmp函數時,將5賦值給num1, 2賦值給num2 (注意順序)
5 > 2, 返回true,num1 與 num2需進行交換;即5應該在2的前面
陣列變為 5, 2, 1, 3, 4第二次 將3賦值給num1, 1賦值給num2,
3 > 1, 返回true,num1 與 num2需進行交換;即3應該在1的前面
陣列變為 5, 2, 3, 1, 4之後經過數次的比較與交換最終排序完成。
最終得到 5 4 3 2 1
到此這篇關於C++中 Sort函數詳細解析的文章就介紹到這了,更多相關C++ Sort函數 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45