C++(15): STL算法:排序(sort)

1. 简述

std::sort 是 C++ 标准库 <algorithm> 中提供的一个函数,用于对容器(如数组、向量等)中的元素进行排序。它基于比较操作对元素进行排序,通常使用高效的排序算法,如快速排序、归并排序或堆排序等。

在实际应用中,std::sort 通常会根据输入数据的大小和特性自适应地选择一种合适的排序算法。例如,对于小型数据集,它可能会选择插入排序或选择排序等简单算法,因为这些算法在小规模数据上通常具有较低的常数因子。对于大型数据集,它可能会选择快速排序、归并排序或堆排序等更高效的算法。

2. 原型

template<class RandomIt>

void sort( RandomIt first, RandomIt last );

template<class RandomIt, class Compare>

void sort( RandomIt first, RandomIt last, Compare comp );

****first 和 last:****这两个参数是迭代器,分别指向要排序序列的开始和结束。注意,last 指向的是序列"之后"的位置,所以序列中的元素范围实际上是 [first, last)。

****comp:****这是一个可选的比较函数或函数对象,用于定义排序的顺序。如果提供了这个参数,std::sort 会使用这个比较函数来确定元素的顺序。默认情况下,std::sort 使用 < 操作符来比较元素。

3. 稳定排序

有时候使用sort时,值相同的两个元素,在排序前后的顺序不一定相同,如何解决这个问题呢?答案是使用std::stable_sort

std::stable_sort 是 C++ 标准库 <algorithm> 头文件中提供的一个函数,用于对容器(如数组、向量等)中的元素进行稳定排序。与 std::sort 不同,std::stable_sort 保证了具有相同值的元素的相对顺序在排序后保持不变。

std::stable_sort的使用与std::sort一样,此处不过多赘述。

4. 排序例程

(1)排序数组(正向)

复制代码
int array[] = {3, 1, 5, 9, 5, 7, 9, 3, 5};

std::sort(array, array + sizeof(array) / sizeof(array[0]));

(2)排序数组(反向)

复制代码
int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

int n = sizeof(arr) / sizeof(arr[0]);

sort(arr, arr + n, greater<int>());

(3)vector排序

复制代码
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

std::sort(v.begin(), v.end());

(4)自定义数据排序

对自定义数据进行排序时,需要实现排序函数对象。

复制代码
#include <iostream>

#include <fstream>

#include <sstream>

#include <iomanip>

#include <algorithm>


typedef struct _Student

{

    std::string name;  

    int age;  

}Student;

 

bool compareByAge(const Student& a, const Student& b)

{

    return a.age < b.age;  

}  

 

int main(int argc, char* argv[])

{

    std::vector<Student> people;

    /** 加入一些学生信息. */  

    std::sort(people.begin(), people.end(), compareByAge);  

}
相关推荐
AA陈超3 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-14 属性菜单 - 文本值行
c++·游戏·ue5·游戏引擎·虚幻
云知谷3 小时前
【经典书籍】C++ Primer 第15章类虚函数与多态 “友元、异常和其他高级特性” 精华讲解
c语言·开发语言·c++·软件工程·团队开发
weixin_582985184 小时前
OpenCV cv::Mat.type() 以及类型数据转换
c++·opencv·计算机视觉
oioihoii7 小时前
深入理解 C++ 现代类型推导:从 auto 到 decltype 与完美转发
java·开发语言·c++
报错小能手7 小时前
项目——基于C/S架构的预约系统平台 (1)
开发语言·c++·笔记·学习·架构
lingran__7 小时前
算法沉淀第十天(牛客2025秋季算法编程训练联赛2-基础组 和 奇怪的电梯)
c++·算法
oioihoii9 小时前
当无符号与有符号整数相遇:C++中的隐式类型转换陷阱
java·开发语言·c++
Yupureki9 小时前
从零开始的C++学习生活 13:红黑树全面解析
c语言·数据结构·c++·学习·visual studio
2401_876221349 小时前
Euler
c++·数学·算法
赵杰伦cpp11 小时前
C++的继承机制精讲
java·开发语言·c++·后端