當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


C++ stable_sort()用法及代碼示例

與std::sort(一樣,stable_sort也對數組進行排序。語法也相同。

// C++ program to demonstrate default behaviour of 
// sort() in STL. 
#include <bits/stdc++.h> 
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 <bits/stdc++.h> 
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<int>()); 
  
    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 

什麽時候比sort()更喜歡stable_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 <bits/stdc++.h> 
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))。



相關用法


注:本文由純淨天空篩選整理自freaky.ju大神的英文原創作品 stable_sort() in C++ STL。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。