STL 之 sort 函數使用方法


關於Sort

    Sort函數是C++ STL(Standard Template Library / 標准函數庫) <algorithm>頭文件中的一個排序函數,作用是將一系列數進行排序,因為它的排序方式類似於快排,且復雜度為O(NlogN),因此在多數情況下可以基本滿足排序的需要,相較於自己手擼快排,使用sort函數在某些情況下也是比較好的一個選擇。

 

    使用前需引入頭文件

#include <algorithm>

 

基本操作說明

    調用格式:sort(first, last, comp)

    參數說明:

        first : 待排序數組起始地址;

        last : 待排序數組結束地址;

        comp : 排序方式,該參數是可省參數,如果省略則以升序方式排序;

 

    那么下面我們就來具體看看這個函數是如何使用的;

 

    Example 1(不使用comp參數的情況)

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main() {
 6     int vec[] = { 5, 1, 9, 4, 6, 7, 2, 0, 1 };
 7     for (int i = 0; i < 9; i++)
 8         cout << vec[i] << ' ';
 9     cout << endl;
10     sort(vec, vec + 9);
11     for (int i = 0; i < 9; i++)
12         cout << vec[i] << ' ';
13     cout << endl;
14 
15     return 0;
16 }

    一段很簡單的樣例程序,結果也是顯而易見的;

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

 

    上面的樣例程序是在不使用參數comp的情況下進行的排序,可以看到默認是以升序排列的,那么想要進行降序排列應該如何實現?

 

    Example 2

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 bool comp(int a, int b) {
 6     return a > b;
 7 }
 8 
 9 int main() {
10     int vec[] = { 5, 1, 9, 4, 6, 7, 2, 0, 1 };
11     for (int i = 0; i < 9; i++)
12         cout << vec[i] << ' ';
13     cout << endl;
14     sort(vec, vec + 9, comp);
15     for (int i = 0; i < 9; i++)
16         cout << vec[i] << ' ';
17     cout << endl;
18 
19     return 0;
20 }

    從以上這段樣例程序中我們就可以了解到comp參數的使用方法,原來它不僅僅只是一個簡單的參數,它實際上是一個比較函數,但需要注意的是comp雖然是一個函數,但是使用時不需要返回值,這是使用規則;

    那么結果當然就是以降序的方式排列元素;

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

 

    以上都是對sort排序的常用操作,下面再增加一個對結構體進行排序的方法;

 

    Example 3

    假設結構體S有三個成員,對結構體進行排序的規則是:先以a進行升序排序,如果a相等則以b進行降序排序,如果b相等則以c進行降序排序;

    對於這類排序實際上與正常排序並沒有不同,唯一需要改變的就是comp函數部分,以下是comp函數部分:

1 bool comp(S x, S y) {
2     if (x.a != y.a) return x.a < y.a;
3     if (x.b != y.b) return x.b > y.b;
4     return x.c > y.c;
5 }

 

    針對排序規則比較復雜的結構體,這里我們用一個例子進行簡單說明(關於例子的詳細情況點擊這里

    排序規則如下:總分進行降序排序,如果總分相等則以分數1進行降序排序,如果分數1相等則以序號進行升序排序;

    以下是comp函數部分:

1 bool comp(Stu x, Stu y) {
2     if (x.s1 + x.s2 > y.s1 + y.s2) return true;
3     else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 > y.s1) return true;
4     else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 == y.s1 && x.num < y.num) return true;
5     else return false;
6 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM