天天看點

【C++程式設計語言】STL 常用算法 排序

作者:煩人的星辰

#挑戰30天在頭條寫日記#

1.常用排序算法

算法簡介:

  • sort 對容器内元素進行排序
  • random_shuffle 洗牌 指定範圍内的元素随機調整次序
  • merge 容器元素合并 并存儲到另一容器中
  • reverse 反轉指定範圍的元素

2.sort 排序算法

/*
    函數原型:
        sort(iterator beg , iterator end ,_pred);
        按照從小到大的順序排列順序
        beg  開始疊代器
        end  結束疊代器
        _pred 謂詞

*/
//提供謂詞
class Greater20 {
public:
    bool operator()(int val,int val2) {
        return val > val2;
    }
};
//列印函數
void myPrint(int val) {
    cout << val << " ";
}
void test01() {

    vector<int> v;
    v.push_back(10);
    v.push_back(40);
    v.push_back(30);
    v.push_back(40);
    v.push_back(20);
    v.push_back(40);

    //利用sort進行升序
    sort(v.begin(), v.end());
    for_each(v.begin(), v.end(), myPrint);

    cout << endl;

    //利用sort進行降序
    sort(v.begin(), v.end(), Greater20());
    for_each(v.begin(), v.end(), myPrint);
    
}
int main() {
    test01();
    system("pause");
    return 0;
}           

3.random_shuffle 指定範圍内的元素随機調整次序

/*
    函數原型:
        random_shuffle(iterator beg , iterator end );
        指定範圍内的元素随機調整次序
        beg  開始疊代器
        end  結束疊代器
*/
void myPrint(int val) {
    cout<<val<<" ";
}
void test01() {

    //雖然打亂了,但是每次啟動後大亂順序都一樣
    //如果想要每次打亂順序不同需要加上 随機數種子
    srand((unsigned int)time(NULL));

    vector<int> v;
    for (int i = 0; i < 10; i++) {
        v.push_back(i);
    }

    //利用洗牌算法 打亂順序
    random_shuffle(v.begin(), v.end());
    for_each(v.begin(), v.end(), myPrint);
}
int main() {
    test01();
    system("pause");
    return 0;
}           

4.merge 兩個容器元素合并,并存儲到另一個容器中

/*
    函數原型:
        merge(iterator beg1 , iterator end1,iterator beg2,iterator end2,iterator dest );
        容器元素合并,并存儲到另一個容器中
        注意:兩個容器必須是有序的
        beg1  容器1開始疊代器
        end1  容器1結束疊代器
        beg2  容器2開始疊代器
        end2  容器2結束疊代器
        dest  目标容器開始疊代器
*/
void myPrint(int val) {
    cout<<val<<" ";
}
void test01() {

    //開始容器 v1  v2
    vector<int> v1;
    vector<int> v2;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
        v2.push_back(i+1);
    }

    //目标容器
    vector<int> dest;
    //目标容器沒有指定空間   如果忘記會産生報錯
    dest.resize(v1.size() + v2.size());
    merge(v1.begin(), v1.end(), v2.begin(), v2.end(), dest.begin());
    for_each(dest.begin(), dest.end(), myPrint);
}
int main() {
    test01();
    system("pause");
    return 0;
}           

5.reverse 将容器内元素進行反轉

/*
    函數原型:
        reverse(iterator beg ,iterator end);
        反轉指定範圍的元素
        beg  開始疊代器
        end  結束疊代器
*/
void myPrint(int val) {
    cout<<val<<" ";
}
void test01() {

    vector<int> v;
    v.push_back(10);
    v.push_back(30);
    v.push_back(50);
    v.push_back(20);
    v.push_back(40);

    cout << "反轉前" << endl;
    for_each(v.begin(), v.end(), myPrint);
    cout << endl;

    cout << "反轉後" << endl;
    reverse(v.begin(), v.end());
    for_each(v.begin(), v.end(), myPrint);
}
int main() {
    test01();
    system("pause");
    return 0;
}           

繼續閱讀