常用排序算法

简介

sort //对容器内容进行排序
random_shuffle //洗牌,指定范围内的元素随机调整次序
merge //容器元素合并,并存储到另一容器中
reverse //翻转指定范围的元素

sort

函数原型
sort(iterator begin,iterator end,_Pred)

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

class Greater
{
public:
    bool operator()(int val1,int val2)
    {
        return val1 > val2;
    }
};

void test01()
{
    vector<int>v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(5);
    v.push_back(3);
    v.push_back(4);
    v.push_back(6);

    sort(v.begin(), v.end());  //默认排序从小到大
    for_each(v.begin(), v.end(), print);  //1 2 3 4 5 6
    cout << endl;
    sort(v.begin(), v.end(), Greater());  //利用仿函数,实现降序排列
    for_each(v.begin(), v.end(), print);// 6 5 4 3 2 1
}

sort函数默认从小到大排序,但是可以通过仿函数来实现从大到小排序。

random_shuffle

函数原型
random_shuffle(iterator begin,iterator end)
洗牌 指定范围内的元素随机调整次序

void print(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 + 1);
    }
    random_shuffle(v.begin(), v.end());  //洗牌算法
    for_each(v.begin(), v.end(), print); // 9 2 10 3 1 6 8 4 5 7 
}

这个例子我们加入了随机数种子,需要包含头文件<ctime>。这种随机打乱顺序的算法可以用来模拟生活中抽签的例子。

merge

函数原型
merge(iterator begin1,iterator end1,iterator begin2,iterator end2,dest)
作用:两个有序容器合并到一个容器中
begin1、end1 分别是源容器1的起始迭代器和终止迭代器
begin2、end2 分别是另一个源容器2的起始迭代器和终止迭代器
dest 目标容器的起始迭代器

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

void test01()
{
    vector<int> v1;
    vector<int> v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i + 1);
        v2.push_back(i + 5);
    }

    //目标容器
    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(), print); //1 2 3 4 5 5 6 6 7 7 8 8 9 9 10 10 11 12 13 14 
}

在使用merge算法的时候要注意:

  • merge算法自只能对于有序的序列使用,并且两个原容器的顺序应该相同,不能是一个升序一个降序。
  • 目标容器要提前开辟空间,否则无法进行合并。

reverse

函数原型
reverse(iterator begin,iterator end);
反转指定范围的元素

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

void test01()
{
    vector<int> v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i + 1);
    }

    cout << "反转前:" << endl;
    for_each(v1.begin(), v1.end(), print);   //1 2 3 4 5 6 7 8 9 10
    cout << endl;
    reverse(v1.begin(), v1.end());
    cout << "反转后:" << endl;
    for_each(v1.begin(), v1.end(), print);    //10 9 8 7 6 5 4 3 2 1 
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容