像std :: sort()一样,stable_sort也对数组进行排序。语法也相同。
// C++ program to demonstrate default behaviour of
// sort() in STL.
#include
using namespace std;
int main()
{
int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };
int n = sizeof(arr) / sizeof(arr[0]);
stable_sort(arr, arr + n);
cout << "\nArray after sorting using "
"default sort is : \n";
for (int i = 0; i < n; ++i)
cout << arr[i] << " ";
return 0;
}
输出 :
Array after sorting using default sort is :
0 1 2 3 4 5 6 7 8 9
因此,默认情况下,sort()以升序对数组进行排序。
如何按降序排序?
与sort()一样,stable_sort()采用第三个参数,该参数用于指定元素的排序顺序。我们可以传递“ greater()”函数以降序排序。该函数进行比较的方式是将更大的元素放在前面。
// C++ program to demonstrate descending order
// stable sort using greater<>().
#include
using namespace std;
int main()
{
int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };
int n = sizeof(arr) / sizeof(arr[0]);
stable_sort(arr, arr + n, greater());
cout << "Array after sorting : \n";
for (int i = 0; i < n; ++i)
cout << arr[i] << " ";
return 0;
}
输出:
Array after sorting :
9 8 7 6 5 4 3 2 1 0
什么时候更喜欢stable_sort而不是sort()?
有时我们要确保排序数组中相等元素的顺序与原始数组中相等。如果这些值具有关联的其他字段,这将很有用。例如,考虑按分数对学生进行排序,如果两个学生的分数相同,我们可能希望按输入时的顺序将它们保持顺序。有关详细信息,请参考排序算法中的稳定性。
考虑下面的例子。我们有按结束时间排序的时间间隔,我们想按开始时间排序。另外,如果两个开始时间相同,我们希望按结束时间对它们进行排序。 sort()不能保证这一点。
// A C++ program to demonstrate STL stable_sort()
// to sort intervals according to start time.
// Given intervals are sorted according to
// ending time
#include
using namespace std;
// An interval has start time and end time
struct Interval {
int start, end;
};
// Compares two intervals according to staring
// times.
bool compareInterval(Interval i1, Interval i2)
{
return (i1.start < i2.start);
}
int main()
{
// Given intervals are sorted according to end time
Interval arr[] = { {1, 3}, {2, 4}, {1, 7}, {2, 19} };
int n = sizeof(arr) / sizeof(arr[0]);
// sort the intervals in increasing order of
// start time such that the start time intervals
// appear in same order as in input.
stable_sort(arr, arr + n, compareInterval);
cout << "Intervals sorted by start time : \n";
for (int i = 0; i < n; i++)
cout << "[" << arr[i].start << ", " << arr[i].end
<< "] ";
return 0;
}
输出:
Intervals sorted by start time :
[1, 3] [1, 7] [2, 4] [2, 19]
执行
sort()函数通常使用Introsort。因此,sort()可以保留语义等效值的物理顺序,但不能保证。
stable_sort()函数通常使用mergesort。因此,stable_sort()保留语义等效值的物理顺序及其保证。
时间复杂度
对于sort()为O(n * log(n))
对于stable_sort(),如果没有与长度成线性比例的附加内存,则为O(n * log ^ 2(n))。如果可用,则为O(n * log(n))。