使用sort函數進行排序


介紹

  • C++的一個重要組成部分STL(Standard Template Library),即標准模板庫,是一些高級數據結構和算法的集合:高級數據結構(容器)主要包括list、set、vector、map等,這些會在后面的學習中介紹。STL中還包括一些常用的算法,如排序、查找等。

  • 這些高級數據結構和算法的集合是世界上很多聰明人的傑作。STL的目的是標准化組件,這樣就不用重新開發,可以使用現成的組件。STL現在是C++的一部分,因此可以直接使用。

  • 在NOI系列的比賽中,允許使用STL。

  • 為了提高編程效率,要盡量使用STL中提供的容器和算法,以避免不必要的低效率、重復編碼。

  • 本文介紹使用STL中的sort函數進行排序

sort函數:2參數用法##

以下代碼實現了數組的升序排序

#include<algorithm>         //sort函數由庫<algorithm>提供,需要加載頭文件
#include<iostream>
using namespace std;
int main(){
    int a[10]={3, 1, 4, 1, 5, 9, 2, 6, 7, 0};
    sort(a+0, a+10);        //對sort的10個元素進行升序排序
    for(int i=0; i<10; i++)
        cout<<a[i]<<' ';
    return 0;
}
  1. 第一個參數為排序范圍的起始地址,第二個參數為排序范圍的結束地址,但不包含該結束地址上的元素。可以理解為該范圍定義了一個半開半閉區間:[m, n)

  2. 該函數屬於同樣可應用於char,float,double,bool等類型的數組。

sort函數:3參數用法##

由於sort的兩參數用法僅能實現升序排列,有時,我們需要降序或者按照自定義的方式進行排序,例如按照數字位數的多少進行排序。這時可以使用sort函數的3參數用法,在2參數的基礎上增加了一個參數:自定義函數。

以下代碼實現了數組的降序排序

#include<algorithm>         //sort函數由庫<algorithm>提供,需要加載頭文件
#include<iostream>
using namespace std;
                            //自定義比較函數cmp
bool cmp(const int & A, const int & B){
    return A>B;             //如果修改為return A<B就還原為了升序排列
}

int main(){
    int a[10]={3, 1, 4, 1, 5, 9, 2, 6, 7, 0};
    sort(a+0, a+10, cmp);   //對sort的10個元素進行降序排序
    for(int i=0; i<10; i++)
        cout<<a[i]<<' ';
    return 0;
}

自定義函數的本質是制定了一個對象A、B的比較規則,sort函數按照這個規則進行比較,從而完成排序。

sort函數:用於自定義的結構體類型數組

我們自定義的結構體類型數組同樣可以使用sort進行排序,當然,由於自定義類型對象沒有默認的比較規則,你必須使用三參數的sort函數,自定義一個函數來說明比較規則,看下面例題:

有N個學生的成績需要進行排序,輸入的每行信息包括“姓名”,“分數”,姓名是由無空格的英文組成。要求按照如下規則排序:成績為第一排序條件,成績相同的情況下,姓名按照字典先后順序排列,輸出為N行,每行一組姓名和分數

代碼實現

#include<algorithm>         //sort函數由庫<algorithm>提供,需要加載頭文件
#include<iostream>
#include<cstring>
using namespace std;

struct STU{                 //自定義結構體類型STU
    char name[50];
    int  score;
}s[100];                    //STU類型數組s

                            //自定義比較函數cmp說明比較規則
bool cmp(const STU & A, const STU & B){
    if(A.score>B.score)             return true;
    if(A.score<B.score)             return false;
    if(strcmp(A.name, B.name)<0)    return true;
    return false;
}

int main(){
    int N;
    cin>>N;
    for(int i=0; i<N; i++)
        cin>>s[i].name>>s[i].score;
    sort(s, s+N, cmp);      //使用sort排序
    for(int i=0; i<N; i++)
        cout<<s[i].name<<" "<<s[i].score<<endl;
    return 0;
}


免責聲明!

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



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