STL算法(排序)简介mergesortrandom_shufflereverse

简介

merge sort random_shuffle reverse

merge

合并两个有序序列,存放到另一个序列。函数定义:

 #if _ITERATOR_DEBUG_ARRAY_OVERLOADS
template<class _InIt1,
    class _InIt2,
    class _OutTy,
    size_t _OutSize,
    class _Pr> inline
    _OutTy *merge(_InIt1 _First1, _InIt1 _Last1,
        _InIt2 _First2, _InIt2 _Last2,
        _OutTy (&_Dest)[_OutSize], _Pr _Pred)
    {   // copy merging ranges, both using _Pred, array dest
    return (_Unchecked(
        _Merge_no_deprecate(_First1, _Last1,
            _First2, _Last2,
            _Array_iterator<_OutTy, _OutSize>(_Dest), _Pred)));
    }
 #endif /* _ITERATOR_DEBUG_ARRAY_OVERLOADS */

        // TEMPLATE FUNCTION merge
template<class _InIt1,
    class _InIt2,
    class _OutIt> inline
    _OutIt merge(_InIt1 _First1, _InIt1 _Last1,
        _InIt2 _First2, _InIt2 _Last2,
        _OutIt _Dest)
    {   // copy merging ranges, both using operator<
    return (_STD merge(_First1, _Last1, _First2, _Last2, _Dest,
        less<>()));
    }

sort

以默认升序的方式重新排列指定范围内的元素。若要改排序规则,可以输入比较函数。

template<class _RanIt,
    class _Pr> inline
    void sort(_RanIt _First, _RanIt _Last, _Pr _Pred)
    {   // order [_First, _Last), using _Pred
    _DEBUG_RANGE(_First, _Last);
    _Sort_unchecked(_Unchecked(_First), _Unchecked(_Last), _Pred);
    }

        // TEMPLATE FUNCTION sort
template<class _RanIt> inline
    void sort(_RanIt _First, _RanIt _Last)
    {   // order [_First, _Last), using operator<
    _STD sort(_First, _Last, less<>());
    }

random_shuffle

对指定范围内的元素随机调整次序 srand(time(0)); //设置随机种子

template<class _RanIt> inline
    void random_shuffle(_RanIt _First, _RanIt _Last)
    {   // shuffle [_First, _Last) using rand()
    _Rand_urng_from_func _Func;
    _STD shuffle(_First, _Last, _Func);
    }

reverse

对指定范围内的元素逆序

template<class _BidIt> inline
    void reverse(_BidIt _First, _BidIt _Last)
    {   // reverse elements in [_First, _Last)
    _DEBUG_RANGE(_First, _Last);
    _Reverse_unchecked(_Unchecked(_First), _Unchecked(_Last));
    }

示例代码

#include "stdafx.h"
#include "stdafx.h"
#include "iostream"
#include "string"
#include "algorithm"
#include "vector"
#include "list"
#include <functional>
using namespace std;
class Student {
private:
    int number;
    string name;
public:
    //Student() {
    //  this->number = -1;
    //  this->name = "";
    //}
    Student(int number, string name) {
        cout << "构造 " << number << " " << name.c_str() << endl;
        this->number = number;
        this->name = name;
    }
    Student(const Student & stu) {
        //cout << "copy构造" <<stu.getNumber()<<" "<<stu.getName().c_str()<< endl;
        this->number = stu.getNumber();
        this->name = stu.getName();
    }
    ~Student() {
        //cout<<"析构 " << this->number << " " << this->name.c_str() << endl;
    }

    Student& operator=(const Student& stu) {
        this->number = stu.getNumber();
        this->name = stu.getName();
        return *this;
    }

    void print()const {
        cout << "print 》》 " << this->number << " " << this->name.c_str() << endl;
    }

    int getNumber() const {
        return this->number;
    }
    string getName()const {
        return this->name;
    }
};

struct StuFunc
{
    bool operator()(const Student & stu1, const Student & stu2) const {
        cout << "StuFunc》》" << endl;
        stu1.print();
        stu2.print();
        return stu1.getNumber() <stu2.getNumber();
    }
};

void printStuV(vector<Student> v) {
    cout << "开始遍历vector<Student>============" << endl;
    for (vector<Student>::iterator it = v.begin(); it != v.end(); it++) {
        it->print();
    }
    cout << "结束遍历vector<Student>============" << endl;
}
void printNum(vector<int>v) {
    cout << "开始遍历vector<int>============" << endl;
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
    cout << "结束遍历vector<int>============" << endl;
}

int main()
{
    //merge示例
    vector<int> vNum;
    vNum.push_back(1);
    vNum.push_back(3);
    vNum.push_back(5);
    vector<int> vNum2;
    vNum2.push_back(2);
    vNum2.push_back(4);
    vector<int> vNum3;
    vNum3.resize(vNum.size() + vNum2.size());
    merge(vNum.begin(), vNum.end(), vNum2.begin(), vNum2.end(), vNum3.begin());
    printNum(vNum3);

    vector<Student> v;
    v.push_back(Student(1, "one"));
    Student stu2(2, "two");
    v.push_back(stu2);
    v.push_back(Student(4, "four"));
    v.push_back(Student(3, "three"));
    v.push_back(Student(5, "five"));
    cout << "sort 随机排序" << endl;
    sort(v.begin(), v.end(), StuFunc());
    printStuV(v);
    cout << "random_shuffle 随机排序" << endl;
    random_shuffle(v.begin(), v.end());
    printStuV(v);
    cout << "reverse 逆序" << endl;
    reverse(v.begin(), v.end());
    printStuV(v);
    return 0;
}

结果:

sort

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一名叫大蕉的程序员

大数据计数原理1+0=1这你都不会算(一)No.47

hello哈,大家是不是好久没见到我啦?我也是一直在摸索小伙伴们喜欢看到什么东西,不喜欢看什么东西,还请大家多多支持。为了表示感谢。小蕉在这给你们一鞠躬,二鞠躬...

2345
来自专栏HansBug's Lab

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏 Time Limit: 3 Sec  Memory Limit: 128 ...

2899
来自专栏我是业余自学C/C++的

栈(stack)是一种特殊的线性表,其插入(也称入栈或压栈)和删除(也称出栈或弹栈)操作都在表的同一端进行。这一端被称为栈顶(top)另一端称为栈底端(bott...

851
来自专栏前端笔记

【 测试文章 第一篇章 】Hello World 初始程序

Hello World ,中文意思:你好,世界。世界上的第一个程序就是Hello World,由Brian Kernighan创作。 中文名:你好,世界。 ...

32310
来自专栏码匠的流水账

bucket4j使用实例

bucket4j类库是一款优秀的java限流类库,可以用来限流,也可以用作简单调度。

1381
来自专栏ACM算法日常

贪心-HDU 1009

FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th...

1194
来自专栏趣谈编程

二分查找

面试官:写个二分热热身 我心想:不用热身,热的手已经出汗了 二分查找有着查找速度快,平均性能好等优点,但必须要求待查表为有序表,且插入删除困难,面试比较常考,今...

2076
来自专栏微信公众号:Java团长

Java HashMap 源码解析

继上一篇文章Java集合框架综述后,今天正式开始分析具体集合类的代码,首先以既熟悉又陌生的HashMap开始。

1132
来自专栏web编程技术分享

【干货】用大白话聊聊JavaSE — ArrayList 深入剖析和Java基础知识详解(一)

3184
来自专栏曾大稳的博客

HashMap源码分析

HashMap是一个很经典的键值对集合,从它的广泛应用程度和源码的学习角度上我们不得不去解析它。 我们先看一下HashMap的存储结构((图片均来源于网络)),...

912

扫码关注云+社区

领取腾讯云代金券