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};
// ... 後續程式碼將在此處填入不同的排序邏輯
}
當不提供任何比較函數時,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
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
當排序邏較為複雜或需要復用時,定義一個擁有 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
現代 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
std::greater<> 或 Lambda,編譯器優化最佳。std::sort 為不穩定排序,若需保持相等元素相對順序,請改用 std::stable_sort。掌握這四種用法,即可應對絕大多數 C++ 專案中的排序需求。合理運用標準庫組件,不僅能減少錯誤,更能寫出高效、可維護的現代化 C++ 程式碼。