C++學習筆記(三十六)——STL之排序算法

一、STL 算法

C++的STL(Standard Template Library) 提供了一組高效、通用的算法,這些算法適用于各種容器(如 vectorlistsetmap)。
這些算法主要位于 <algorithm><numeric> 頭文件中。

  • 通用性:適用于所有 STL 容器,如 vectorlistdeque 等。
  • 高效性:內部使用優化算法(如快速排序 std::sort)。
  • 一致性:所有算法都基于迭代器操作,使其與不同容器兼容。
  • 可組合性:可結合 lambda 表達式、bindfunction object 使用。

二、STL 算法分類

STL 算法可分為以下幾類:

類別常見算法作用
排序sortstable_sortpartial_sortnth_element排序
搜索findfind_ifcountcount_ifbinary_search查找元素
修改copyreplacereplace_ifswapfill修改容器內容
刪除removeremove_ifunique刪除元素
歸約for_eachaccumulate處理數據
合并mergeset_unionset_intersection處理有序序列
排列組合next_permutationprev_permutation生成排列
堆操作push_heappop_heapmake_heapsort_heap處理堆

三、STL 排序算法

STL 提供了一些常用的排序算法,用于對容器中的元素進行排序。
它們位于 <algorithm> 頭文件中。

算法名稱功能描述時間復雜度空間復雜度使用場景
sort對容器元素進行排序(默認升序)O(n log n)O(log n)適合一般排序,且不關心相等元素順序
stable_sort保證相等元素的順序不變O(n log n)O(n)適合需要穩定排序的場景,如多次排序
partial_sort僅對前 n 個元素排序O(n log k)O(n)只需要排序最小的 n 個元素
nth_element對第 n 小元素進行排序,且兩側有序O(n)O(1)尋找第 n 小元素,適合大數據情況
reverse反轉容器元素的順序O(n)O(1)用于反轉容器,常與排序結合使用

(1) sort

  • 功能:對容器中的元素進行排序,默認按升序排序。
  • 時間復雜度O(n log n)(平均和最壞情況)。
  • 空間復雜度O(log n)(遞歸調用棧空間)。

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = {5, 2, 8, 3, 1};sort(vec.begin(), vec.end());for (int i : vec) {std::cout << i << " ";  // 輸出:1 2 3 5 8}cout << endl;system("pause");return 0;
}

注意:

  • sort是最常用的排序算法,排序速度較快,但不能保證相等元素的順序不變

(2) stable_sort

  • 功能:與 sort 相似,但保證相等元素的相對順序不變
  • 時間復雜度O(n log n)(與 sort 相同)。
  • 空間復雜度O(n)(通常需要額外空間用于穩定性保證)。

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 5, 2, 8, 3, 5 };stable_sort(vec.begin(), vec.end());for (int i : vec) {cout << i << " ";  // 輸出:2 3 5 5 8}cout << endl;system("pause");return 0;
}

注意:

  • stable_sort適用于需要保留相等元素順序的場景,如按照多個條件排序時。

(3)partial_sort

  • 功能:對容器中的前 n 個元素進行排序,使它們排好序,其他元素保持原順序。
  • 時間復雜度O(n log k),其中 n 是需要排序的元素數目,k 容器中的元素總數。
  • 空間復雜度O(n)
  • 說明:適用于只需要獲取最小(或最大)n 個元素的情況。

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 5, 2, 8, 3, 1 };// 排序前3個元素partial_sort(vec.begin(), vec.begin() + 3, vec.end());for (int i : vec) {cout << i << " ";  // 輸出:1 2 3 8 5}cout << endl;system("pause");return 0;
}

注意:

  • partial_sort適用于只需要獲取最小(或最大)n 個元素的情況。

(4)nth_element

  • 功能:將容器中的元素按照第 n 小元素排列,使得n 小元素的左邊小于等于它,右邊大于等于它
  • 時間復雜度O(n),即線性時間復雜度。
  • 空間復雜度O(1)

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 5, 2, 8, 3, 1 };// 將第3小的元素放到第3位置,且兩側元素滿足排序條件nth_element(vec.begin(), vec.begin() + 2, vec.end());for (int i : vec) {cout << i << " ";  // 輸出:1 2 3 5 8}cout << endl;system("pause");return 0;
}

注意:

  • nth_element通常用于找到容器中的第 n 小(或大)元素,不需要完全排序。

(5)reverse

  • 功能:反轉容器中元素的順序。
  • 時間復雜度O(n)n 是容器中的元素數目。
  • 空間復雜度O(1),原地操作。

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 1, 2, 3, 4, 5 };// 反轉數組reverse(vec.begin(), vec.end());for (int i : vec) {cout << i << " ";  // 輸出:5 4 3 2 1}cout << endl;system("pause");return 0;
}

注意:

  • reverse用于反轉容器中的元素,常用于從降序排序轉換為升序排序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77748.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77748.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java基于SpringBoot的企業車輛管理系統,附源碼+文檔說明

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

el-date-picker時間范圍 賦值報錯問題

問題&#xff1a; 點擊時間范圍組件右邊清除圖標&#xff0c;點擊近6小時會把設置好的時間賦值給時間范圍組件 但是出現報錯 原因&#xff1a; 嘗試對null值進行屬性設置操作&#xff1a;修改一個數組的元素&#xff0c;但此時這個數組是null&#xff0c;而不是預期的數組類型…

STM32 中斷系統深度剖析

在嵌入式系統開發領域&#xff0c;STM32 系列微控制器憑借其強大的性能和豐富的資源被廣泛應用。中斷系統作為 STM32 的關鍵特性之一&#xff0c;能夠極大地提升系統的實時響應能力和多任務處理效率。本文將基于 STM32F4 系列芯片&#xff0c;深入剖析中斷與外設中斷的原理、配…

1.3 本書結構概覽:從理論基礎到實踐案例的系統闡述

本書采用由淺入深、理論聯系實踐的結構設計&#xff0c;旨在為讀者提供一個關于大模型與智能代理(Agent)技術的全面認知框架與實施路徑。全書共分為十章&#xff0c;系統性地覆蓋了從技術基礎到企業落地的完整知識鏈條&#xff0c;現概述如下&#xff1a; 首先&#xff0c;第一…

小白訓練日記——2025/4/22

實驗描述 將GobalM模塊加入到changerEx的stage2中。 下面展示一些內聯片段&#xff1a; model dict(backbonedict(interaction_cfg(None,dict(typeGlobalM, embed_dim128,num_heads32,axial_strategyrow),dict(typeChannelExchange, p1/2),dict(typeChannelExchange, p1/2))…

【上位機——MFC】MFC入門

MFC庫中相關類簡介 CObject MFC類庫中絕大部分類的父類&#xff0c;提供了MFC類庫中一些基本的機制。 對運行時類信息的支持。對動態創建的支持。對序列化的支持。 CWinApp 應用程序類&#xff0c;封裝了應用程序、線程等信息。 CDocument 文檔類&#xff0c;管理數據 F…

代碼隨想錄第三十七天|華為秋季筆試真題230823

刷題小記&#xff1a; 主要偏向扎實編碼基礎的考察&#xff0c;但貌似近些年題目難度有所提高&#xff0c;僅供參考。 卡碼網136.獲取連通的相鄰節點列表&#xff08;卡碼網136.獲取連通的相鄰節點列表&#xff09; 題目分析&#xff1a; 題目描述&#xff1a; 存在N個轉發…

計算機視覺cv2入門之實時手勢檢測

前邊我們已經講解了使用cv2進行圖像預處理以及針對實時視頻流文件的操作方法&#xff0c;這里我們通過實時手勢檢測這一案例來學習和實操一下。 大致思路 根據手勢的種類以及指定手勢圖片數量來構建一個自己的手勢圖片數據集CNN模型訓練手勢圖片數據集使用訓練好的模型進行實時…

Java 安全:如何防止 SQL 注入與 XSS 攻擊?

Java 安全&#xff1a;如何防止 SQL 注入與 XSS 攻擊&#xff1f; 在 Java 開發領域&#xff0c;安全問題至關重要&#xff0c;而 SQL 注入和 XSS 攻擊是兩種常見的安全威脅。本文將深入探討如何有效防止這兩種攻擊&#xff0c;通過詳細代碼實例為您呈現解決方案。 一、SQL 注…

Itext進行PDF的編輯開發

這周寫了一周的需求&#xff0c;是制作一個PDF生成功能&#xff0c;其中用到了Itext來制作PDF的視覺效果。其中一些功能不是很懂&#xff0c;僅作記錄&#xff0c;若要學習請仔細甄別正確與否。 開始之前&#xff0c;我還是想說&#xff0c;這傻福需求怎么想出來的&#xff0c…

android編譯使用共享緩存

注意 服務器端與客戶端系統的版本號需為Ubuntu20.04ccache版本不能低于4.4執行用戶需要為sudo權限服務器端nfs目錄權限必須為nobody:nogroup 一、服務端配置&#xff1a; 在服務器192.168.60.142上配置 NFS 共享 1.安裝 NFS 服務器&#xff1a; 1 sudo apt-get install nfs…

工作中sql總結

sql總結 場景1分組后失敗的成功數據帶入場景2完全性質的一對一匹配場景3虛擬戶的特殊匹配場景4多對多匹配場景5一對一匹配場景6 一對多匹配 場景1分組后失敗的成功數據帶入 現有一批交易表的數據&#xff0c;根據戶名&#xff0c;日期&#xff0c;金額分組&#xff0c;存在TRA…

QML FontDialog:使用FontDialog實現字體選擇功能

目錄 引言相關閱讀FontDialog基本介紹字體屬性 實例演示項目結構代碼實現Main.qmlmain.cpp 代碼解析運行效果 總結 引言 在桌面應用程序開發中&#xff0c;字體選擇是一個常見的需求。Qt Quick提供了FontDialog組件來實現這一功能。本文將介紹如何在Qt Quick應用程序中使用Fon…

MCP(3):在CherryStudio中使用MCPServer

上一文章講述了如何新建一個MCP Server&#xff0c;并在MCP Inspector完成測試。本文講述如何在CherryStudio中進行測試。 Cherry Studio 是一款由 CherryHQ 開發的多模型支持的 AI 桌面助手&#xff0c;兼容 Windows、Linux 和 macOS 系統&#xff0c;旨在為用戶提供更便捷、…

面試題-鏈表(2)

1.合并兩個有序鏈表&#xff1a; 21. 合并兩個有序鏈表 - 力扣&#xff08;LeetCode&#xff09; public ListNode mergeTwoLists(ListNode headA, ListNode headB){ListNode newheadnew ListNode(-1);ListNode curnewhead;while(headA!null&&headB!null){if(headA.va…

微軟Entra新安全功能引發大規模賬戶鎖定事件

誤報觸發大規模鎖定 多家機構的Windows管理員報告稱&#xff0c;微軟Entra ID新推出的"MACE"&#xff08;泄露憑證檢測應用&#xff09;功能在部署過程中產生大量誤報&#xff0c;導致用戶賬戶被大規模鎖定。這些警報和鎖定始于昨夜&#xff0c;部分管理員認為屬于誤…

【MATLAB第117期】#源碼分享 | 基于MATLAB的SSM狀態空間模型多元時間序列預測方法(多輸入單輸出)

【MATLAB第117期】#源碼分享 | 基于MATLAB的SSM狀態空間模型多元時間序列預測方法&#xff08;多輸入單輸出&#xff09; 引言 本文使用狀態空間模型實現失業率遞歸預測&#xff0c;狀態空間模型&#xff08;State Space Model, SSM&#xff09;是一種用于描述動態系統行為的…

谷歌瀏覽器搜索后的頁面總是覆蓋當前頁面

最近將搜索引擎換為谷歌后&#xff0c;發現&#xff0c;每次搜索完的結果頁面總是覆蓋當前頁面&#xff0c;非常不方便&#xff0c;在瀏覽器設置中又找不到類似設置的選項&#xff0c;然后終于在一個博主“如何設置使谷歌瀏覽器打開鏈接自動跳轉到新標簽頁而不是覆蓋當前頁面?…

記錄學習的第三十天

今天終于又開始寫博客了。 還是滑動窗口問題&#xff0c;這段時間不出意外都是這了 上面的思路是我自己做的&#xff0c;但是不知道為什么不行&#xff0c;有沒有大佬能指點一下我。 接下來這道題是進階的。不過我之前的基礎都做的很艱難&#xff0c;道阻且長啊。

QTextDocument 入門

一、QTextDocument QTextDocument 是 Qt 中用于處理富文本文檔的核心類&#xff0c;支持文本格式、圖片、表格等復雜內容。 1. QTextDocument 入門 1.1 基本概念 QTextDocument 是 Qt 中用于處理富文本內容的核心類&#xff0c;它提供了&#xff1a; 結構化文本存儲&#x…