溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中Sort函數怎么調用

發布時間:2022-08-26 14:51:57 來源:億速云 閱讀:132 作者:iii 欄目:開發技術

這篇文章主要講解了“C++中Sort函數怎么調用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++中Sort函數怎么調用”吧!

    前言 

    sort函數是algorithm庫下的一個函數,sort函數是不穩定的,即大小相同的元素在排序后相對順序可能發生改變,如果某些場景需要保持相同元素間的相對順序,可使用stable_sort函數,這里不過多介紹。

    一、sort函數調用的兩種方式

    C++中Sort函數怎么調用

    默認: 兩個參數first,last,將[first, last)區間內元素升序排列?!咀⒁鈪^間為左閉右開】

    自定義排序: 需用戶指定排序規則Compare comp,將 [first, last)區間內的元素按照用戶指定的順序排列。

    二、sort函數使用場景

    由于在排序過程中涉及到元素交換等操作,所以sort函數僅支持可隨機訪問的容器,如數組, string、vector、deque等。

    三、sort函數排序原理

    sort()并非只是普通的快速排序,除了對普通的快速排序進行優化,它還結合了插入排序和堆排序。根據不同的數量級別以及不同情況,能自動選用合適的排序方法。當數據量較大時采用快速排序,分段遞歸。一旦分段后的數據量小于某個閥值,為避免遞歸調用帶來過大的額外負荷,便會改用插入排序。而如果遞歸層次過深,有出現最壞情況的傾向,還會改用堆排序。

    所以無論元素初始時為何種狀態,sort()的平均排序復雜度為均為O(N*log2(N)) ,具有不錯的的性能,在刷算法題時,可以直接使用sort()來對數據進行排序,而不需手動編寫排序函數。

    四、sort函數使用案例

    1.升序排列

    sort函數如果不傳入第三個參數,則默認是升序排列。

    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    int main() {
        // 方式一、使用數組
        int a[10] = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0};
        sort(a, a + 10);  // 10為元素個數
    
        for (int i = 0; i < 10; i++) cout << a[i] << ' ';		// 輸出排序后數組
        cout << endl;
    
        // 方式二、使用 vector
        vector<int> arr = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0};
        sort(arr.begin(), arr.end());  // 10為元素個數
        for (int i = 0; i < 10; i++) cout << arr[i] << ' ';	// 輸出排序后數組
    
        return 0;
    }

    2.降序排列

    實現方式1

    實現降序排列,需傳入第三個參數&ndash;比較函數,greater<type>(),這里的元素為int 類型,即函數為 greater<int>(); 如果是其他基本數據類型如float、double、long等也是同理。

    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    int main() {
        // 方式一、使用數組
        int a[10] = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0};
        sort(a, a + 10, greater<int>());  // 10為元素個數
    
        for (int i = 0; i < 10; i++) cout << a[i] << ' ';		// 輸出排序后數組
        cout << endl;	// 輸出 9 8 7 6 5 4 3 2 1 0 
    
        // 方式二、使用 vector
        vector<int> arr = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0};
        sort(arr.begin(), arr.end(), greater<int>()); 
        for (int i = 0; i < 10; i++) cout << arr[i] << ' ';	// 輸出排序后數組
    
        return 0;
    }
    實現方式2

    我們也可以使用自定義的比較函數,函數的返回值為bool類型, 例如:

    bool cmp(int num1, int num2) {
        return num1 > num2;     // 可以簡單理解為 > 降序排列;  <  升序排列
    }
    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    bool cmp(int num1, int num2) {
        return num1 > num2;     // 可以簡單理解為 >: 降序排列;  < : 升序排列
    }
    
    int main() {
        // 一、使用數組
        int a[10] = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0};
        sort(a, a + 10, cmp);  // 使用自定義排序函數
    
        for (int i = 0; i < 10; i++) cout << a[i] << ' ';		// 輸出排序后數組
        cout << endl;	// 輸出 9 8 7 6 5 4 3 2 1 0 
    
        // 二、使用 vector
        vector<int> arr = {9, 6, 3, 8, 5, 2, 7, 4, 1, 0};
        sort(arr.begin(), arr.end(), cmp);   // 使用自定義排序函數
        for (int i = 0; i < 10; i++) cout << arr[i] << ' ';	// 輸出排序后數組
    
        return 0;
    }

    3.結構體排序(自定義比較函數)

    要對元素進行排序,前提是元素之間可以進行比較,即誰大誰小。 基本數據類型可直接進行大小比較, 但結構體元素之間的大小關系需要我們自己指定,如果不指定,則結構體之間大小關系就不確定,則不能夠排序。

    結構體排序案例1: 對學生信息進行排序

    學生有姓名,分數兩個屬性,

    struct Student {    // 學生結構體
        string name;    // 學生姓名
        int grade;      // 學生分數
        Student();  // 無參數構造函數
        Student(string name, int grade) : name(name), grade(grade) {};  // 有參數構造函數
    };

    需求: 對一個班級內的學生成績進行排序,首先按成績進行排序降序排列,若成績相同,則按照姓名字典順序升序排列。

    自定義排序函數;

    bool cmp(Student s1, Student s2) {  // 自定義排序
        if (s1.grade != s2.grade) {     // 如果學生成績不相同
            return s1.grade > s2.grade; // 則按照成績降序排列
        }
        return s1.name < s2.name;   // 否則按照姓名升序排列
    }

    排序代碼:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    
    struct Student {    // 學生結構體
        string name;    // 學生姓名
        int grade;      // 學生分數
        Student();  // 無參數構造函數
        Student(string name, int grade) : name(name), grade(grade) {};  // 有參數構造函數
    };
    
    bool cmp(Student s1, Student s2) {  // 自定義排序
        if (s1.grade != s2.grade) {     // 如果學生成績不同
            return s1.grade > s2.grade; // 則按照成績降序排列
        }
        return s1.name < s2.name;   // 否則按照姓名升序排列
    }
    
    int main() {
        vector<Student> studs;
        studs.emplace_back("Bob", 80);
        studs.emplace_back("Ali", 90);
        studs.emplace_back("Ann", 85);
        studs.emplace_back("Liming", 90);
        studs.emplace_back("Trump", 79);
        studs.emplace_back("Fury", 58);
        studs.emplace_back("Jam", 62);
        studs.emplace_back("Lucy", 89);
    
        sort(studs.begin(), studs.end(), cmp);  // 排序
        for (int i = 0; i < studs.size(); i++) {    // 輸出結果
            cout << studs[i].name << "\t" << studs[i].grade << endl;
        }
        return 0;
    }

    五、自定義comp函數返回true或false作用

    bool cmp(int num1, int num2) {	// 實現降序排列
        return num1 > num2;	// num1大于num2時返回true,否則返回false
    }

    自定義函數返回值為bool類型

    • 若返回true,則表示num1num2應該交換順序;

    • 若返回false, 則num1num2 保持原有順序;

    下面舉例說明自定義比較函數的執行過程:

    對 2, 5, 1, 3, 4 降序排列
    調用cmp函數時,將5賦值給num1, 2賦值給num2 (注意順序)
    5 > 2, 返回true,num1 與 num2需進行交換;即5應該在2的前面
    數組變為  5, 2, 1, 3, 4

    第二次 將3賦值給num1, 1賦值給num2,
    3 > 1, 返回true,num1 與 num2需進行交換;即3應該在1的前面
    數組變為  5, 2, 3, 1, 4

    之后經過數次的比較與交換最終排序完成。
    最終得到 5 4 3 2 1 

    C++中Sort函數怎么調用

    感謝各位的閱讀,以上就是“C++中Sort函數怎么調用”的內容了,經過本文的學習后,相信大家對C++中Sort函數怎么調用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女