C++提高编程 5 STL -常用算法(排序算法)


5.3  常用排序算法

学习目标:掌握常用的排序算法

算法简介:sort        //对容器内元素进行排序

     random_shuffle     //洗牌  指定范围内的元素随机调整次序

     merge       //容器元素合并,并存储到另一个容器

     reverse       //反转指定范围内的元素

5.3.1 sort     //对容器内元素进行排序

函数原型:sort(iterator beg, iterator end, _Pred);

#include
using namespace std;
#include   
#include

//普通函数
void print1(int val)
{
    cout << val << " ";
}
//仿函数
class print2
{
public:
    void operator()(int val)
    {
        cout << val << " ";
    }

};
//常用排序算法  sort
void test1()
{
    vector<int>v;
    v.push_back(10);
    v.push_back(30);
    v.push_back(50);
    v.push_back(20);
    v.push_back(40);

    //利用sort算法进行升序(默认)
    sort(v.begin(), v.end());
    for_each(v.begin(), v.end(), print1);            //10 20 30 40 50  //for_each的_func  普通函数和仿函数都可以
    cout << endl;
    for_each(v.begin(), v.end(), print2());            //10 20 30 40 50
    cout << endl;

    //改为降序
    sort(v.begin(), v.end(), greater<int>());        //可以使用greater  也可以自己写个前数大于后数的仿函数
    for_each(v.begin(), v.end(), print2());            //50 40 30 20 10
    cout << endl;

}


int main()
{
    test1();

    system("pause");
    return 0;
}

5.3.2 random_shuffle     //洗牌  指定范围内的元素随机调整次序

函数原型:random_shuffle(iterator beg, iterator end);

//用时记得加随机数种子,不然每次洗牌结果都一样

#include
using namespace std;
#include   
#include
#include

//常用排序算法  random_shuffle

void print1(int val)
{
    cout << val << " ";
}

void test1()
{
    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(), print1);
    cout << endl;
}


int main()
{
    test1();

    system("pause");
    return 0;
}

5.3.3  merge    //两个容器合并,并存到另一个容器中

函数原型:merge(iterator  beg1,  iterator  end1,iterator  beg2,  iterator  end2,iterator  dest);

//注意:两个容器必须是有序的,beg1(2):容器1(2)开始迭代器        dest:目标容器开始迭代器

#include
using namespace std;
#include   
#include

//常用排序算法  merge
void print1(int val)
{
    cout << val << " ";
}

void test1()
{
    vector<int>v1;
    vector<int>v2;

    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
        v2.push_back(i + 1);
    }

    //目标容器
    vector<int>vTarget;
    vTarget.resize(v1.size() + v2.size());

    merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    for_each(vTarget.begin(), vTarget.end(), print1);        //0 1 1 2 2 

3 3 4 4 5 5 6 6 7 7 8 8 9 9 10
cout << endl; } int main() { test1(); system("pause"); return 0; }

5.3.4  reverse     //反转指定范围内的元素

函数原型:reverse(iterator  beg,  iterator  end);

#include
using namespace std;
#include   
#include

//常用排序算法  reverse
void print1(int val)
{
    cout << val << " ";
}

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

    cout << "反转前:";
    for_each(v.begin(), v.end(), print1);        //10 30 50 20 40
    cout << endl;

    cout << "反转后:";
    reverse(v.begin(), v.end());
    for_each(v.begin(), v.end(), print1);        //40 20 50 30 10
    cout << endl;
}


int main()
{
    test1();

    system("pause");
    return 0;
}