首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ STL sort() 函數完整指南:從基本排序到自定義比較器

     編輯:關於C++

C++ 標準庫中的 std::sort 是開發者進行排序操作最常用、最高效的工具之一。它定義於 <algorithm> 標頭檔中,預設使用 Introsort(內省排序)演算法,結合了快速排序、堆排序與插入排序的優點,平均時間複雜度為 O(N log N),且避免了快速排序最壞情況下 O(N²) 的效能陷阱。本文將透過完整的程式碼範例,詳細解析 sort() 的四種核心用法。

基本環境與測試資料

所有範例均基於以下環境:一個包含 10 個整數的 std::array 容器,初始順序為 {5, 7, 4, 2, 8, 6, 1, 9, 0, 3}。我們將展示如何對此資料進行遞增、遞減以及自定義邏輯的排序。

#include <array>
#include <functional>
#include <algorithm>
#include <iostream>

int main() {
    std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
    // ... 後續程式碼將在此處填入不同的排序邏輯
}

1. 預設排序:遞增順序 (operator<)

當不提供任何比較函數時,std::sort 預設使用 operator< 進行比較,將元素由小到大排列。這是最基礎也最常見的用法。

// 使用預設 operator<
std::sort(s.begin(), s.end());
for (int a : s) {
    std::cout << a << " ";
}
std::cout << '\n';

輸出結果: 0 1 2 3 4 5 6 7 8 9

2. 使用標準庫比較器:遞減順序 (std::greater)

C++ 標準庫在 <functional> 中提供了現成的比較函數物件。std::greater<T> 可直接用於實現遞減排序,無需自行撰寫比較邏輯。

// 使用標準庫比較函數物件 std::greater
std::sort(s.begin(), s.end(), std::greater<int>());
for (int a : s) {
    std::cout << a << " ";
}
std::cout << '\n';

輸出結果: 9 8 7 6 5 4 3 2 1 0

3. 自定義函數物件

當排序邏較為複雜或需要復用時,定義一個擁有 operator() 的結構體或類別(即 Functor)是傳統且高效的做法。編譯器通常能將其內聯優化,效能與函數指標相比更優。

// 自定義函數物件
struct CustomLess {
    bool operator()(int a, int b) const {
        return a < b; // 遞增邏輯
    }
};

CustomLess customLess;
std::sort(s.begin(), s.end(), customLess);
for (int a : s) {
    std::cout << a << " ";
}
std::cout << '\n';

輸出結果: 0 1 2 3 4 5 6 7 8 9

4. Lambda 表達式 (C++11 起支援)

現代 C++ 推薦使用 Lambda 表達式編寫就地比較邏輯,語法簡潔、可讀性高,且同樣享有內聯優化優勢。以下範例示範遞減排序(return b < a)。

// 使用 Lambda 表達式進行遞減排序
std::sort(s.begin(), s.end(), [](int a, int b) {
    return b < a;
});
for (int a : s) {
    std::cout << a << " ";
}
std::cout << '\n';

輸出結果: 9 8 7 6 5 4 3 2 1 0

完整程式執行結果總覽

將上述四個排序步驟依序執行,完整的標準輸出如下:

0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0

效能與選擇建議

  • 簡單類型 (int, float 等):優先使用 std::greater<> 或 Lambda,編譯器優化最佳。
  • 複雜邏輯/需復用:使用自定義 Functor 或具名 Lambda。
  • 穩定性需求:std::sort 為不穩定排序,若需保持相等元素相對順序,請改用 std::stable_sort。

掌握這四種用法,即可應對絕大多數 C++ 專案中的排序需求。合理運用標準庫組件,不僅能減少錯誤,更能寫出高效、可維護的現代化 C++ 程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved