当前位置: 首页 > article >正文

C++ 常用排序算法

排序算法

算法简介

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

1. sort

功能:对容器内部分区间按某种规则进行排序

函数原型:

sort(iterator beg, iterator end, _Pr) 
按规则对区间[beg, end)内的元素进行排序
beg 区间开始迭代器
end 区间结束迭代器
_Pr 谓词
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;

// sort 

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

void test01()
{
    vector<int> v;
    v.push_back(80);
    v.push_back(20);
    v.push_back(60);
    v.push_back(40);
    v.push_back(50);

    // 默认排序规则为从小到大,进行降序排序
    sort(v.begin(), v.end());

    for_each(v.begin(), v.end(), myPrint);
    cout << endl;

    // 降序
    sort(v.begin(), v.end(), greater<int>());
    for_each(v.begin(), v.end(), myPrint);
    cout << endl;
}


int main(int argc, char const *argv[])
{
    test01();
    return 0;
}

2. random_shuffle

功能: 对容器中的元素进行随机打乱

函数原型:
random_shuffle(iterator start, iterator end, random number generator)

参数说明:
start:容器的起始迭代器
end:容器的结束迭代器
random number generator:随机数产生器

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;

// random_shuffle


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);
    cout << endl;
}


int main(int argc, char const *argv[])
{
    test01();
    return 0;
}

3. merge

功能: 两个容器元素合并,并存储到另一容器中

注意: 两个容器必须是有序的

函数原型:
merge(iterator first1, iterator last1, iterator first2, iterator last2, iterator result)

参数说明:
first1 第一个容器的开始迭代器
last1 第一个容器的结束迭代器
first2 第二个容器的开始迭代器
last2 第二个容器的结束迭代器
result 合并之后的容器的开始迭代器

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;

// merge

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

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

    vector<int> v2;
    for (int i = 0; i < 10; i++){
        v2.push_back(i);
    }
    // 如果不是有序的,则合并后的结果是无序的
    v2.push_back(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(), myPrint);
    cout << endl;

    //  在排序
    sort(vTarget.begin(), vTarget.end());
    for_each(vTarget.begin(), vTarget.end(), myPrint);
    cout << endl;
}


int main(int argc, char const *argv[])
{
    test01();
    return 0;
}

4. reverse

功能: 将容器中的元素进行逆置

函数原型:
reverse(iterator first, iterator last);

参数说明:
first:开始迭代器
last:结束迭代器

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;

// reverse
void myPrint(int val){
    cout << val << " ";
}

void test01()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);
    for_each(v.begin(), v.end(), myPrint);
    cout << endl;
    // 翻转
    reverse(v.begin(), v.end());
    for_each(v.begin(), v.end(), myPrint);
    cout << endl;
}

int main(int argc, char const *argv[])
{
    test01();
    return 0;
}


http://www.kler.cn/a/530539.html

相关文章:

  • 【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具01
  • 完全卸载mysql server步骤
  • 吴恩达深度学习——超参数调试
  • leetcode 844 比较含退格的字符串
  • https的原理
  • 【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧
  • 音视频入门基础:RTP专题(5)——FFmpeg源码中,解析SDP的实现
  • XML DOM 节点信息
  • 眼见着折叠手机面临崩溃,三星计划增强抗摔能力挽救它
  • 【LeetCode 刷题】回溯算法-分割问题
  • 如何本地部署DeepSeek?DeepThink R1 本地部署全攻略:零基础小白指南。
  • 蓝桥杯单片机第七届省赛
  • MySQL大表优化方案
  • GEE | 计算Sentinel-2的改进型土壤调整植被指数MSAVI
  • Maven全解析:Maven 进阶
  • C++游戏开发实战:从引擎架构到物理碰撞
  • Hot100之矩阵
  • JAVA安全—反射机制攻击链类对象成员变量方法构造方法
  • 第十三章 I 开头的术语
  • 【FreeRTOS 教程 六】二进制信号量与计数信号量
  • 【llm对话系统】大模型 Llama 源码分析之归一化方法 RMS Norm
  • 【C++】类和对象(4) —— 类的默认成员函数(下)
  • 基于python的Kimi AI 聊天应用
  • HTML5 Canvas 与 SVG:让网页图形与动画活跃起来
  • 计算机网络 应用层 笔记1(C/S模型,P2P模型,FTP协议)
  • 搜索功能多模块展示如何实现