在C++编程中,排序是极其常见的操作。标准模板库(STL)提供了多种排序函数,其中 std::stable_sort 是一个非常重要的稳定排序算法。本文将从零开始,详细讲解什么是稳定排序、为什么需要它,以及如何在C++中正确使用 stable_sort,即使是编程小白也能轻松掌握。
在讨论 stable_sort 之前,我们先理解“排序稳定性”的概念。
一个排序算法被称为“稳定”的,是指:当两个元素的排序关键字相等时,它们在排序后的相对顺序与排序前保持一致。
举个例子:
// 假设有如下学生数据(姓名, 成绩)("张三", 85)("李四", 90)("王五", 85)("赵六", 90)// 按成绩排序后,如果使用稳定排序:("张三", 85) // 保持原顺序("王五", 85)("李四", 90)("赵六", 90)// 如果是非稳定排序,可能变成:("王五", 85) // 顺序被打乱("张三", 85)("赵六", 90)("李四", 90)在某些应用场景中(如多级排序、保留原始输入顺序等),稳定性至关重要。

C++ STL 提供了 std::stable_sort 函数,位于 <algorithm> 头文件中。它的特点是:保证排序的稳定性,时间复杂度通常为 O(n log n),最坏情况下为 O(n (log n)²)(取决于实现)。
#include <algorithm>// 默认升序排序std::stable_sort(first, last);// 自定义比较函数std::stable_sort(first, last, comp);first:容器起始迭代器last:容器结束迭代器(不包含)comp:可选的比较函数或 lambda 表达式下面是一个完整的 C++ 程序,演示如何使用 stable_sort 对学生按成绩排序,并保持同分学生的原始顺序:
#include <iostream>#include <vector>#include <algorithm>#include <string>struct Student { std::string name; int score;};int main() { std::vector<Student> students = { {"张三", 85}, {"李四", 90}, {"王五", 85}, {"赵六", 90} }; // 使用 stable_sort 按成绩升序排序 std::stable_sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.score < b.score; } ); // 输出结果 for (const auto& s : students) { std::cout << s.name << ": " << s.score << "\n"; } return 0;}输出结果为:
张三: 85王五: 85李四: 90赵六: 90可以看到,“张三”始终排在“王五”前面,因为他们在原始列表中就是这个顺序——这就是 C++稳定排序 的体现。
C++ STL 还提供了 std::sort,它通常更快(平均 O(n log n)),但不保证稳定性。而 std::stable_sort 虽然可能稍慢,但能确保相同元素的相对顺序不变。
| 特性 | std::sort | std::stable_sort |
|---|---|---|
| 稳定性 | 否 | 是 |
| 时间复杂度 | O(n log n) | O(n log n) ~ O(n (log n)²) |
| 适用场景 | 无需保持相等元素顺序 | 需要保持相等元素原始顺序 |
以下情况推荐使用 std::stable_sort:
通过本文,我们深入学习了 C++ 中的 稳定排序算法,特别是 std::stable_sort 的使用方法和适用场景。记住:当你需要在排序后保持相等元素的原始相对顺序时,务必选择 stable_sort 而非普通的 sort。
掌握 STL稳定排序 技巧,不仅能写出更健壮的代码,还能在面试和实际项目中展现你的专业素养。希望这篇教程对你理解 C++排序算法 和 stable_sort用法 有所帮助!
本文由主机测评网于2025-12-08发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124680.html