C++标准库中sort()排序函数的使用

sort()函数的介绍

sort()函数是包含在C++标准库头文件算法类别标头<algorithm> 中的,使用时需要导入该库文件#include<algorithm>。sort()函数用来实现将指定范围中的元素按非降序顺序排列,或根据二元谓词指定的排序条件排列。sort()函数的实现使用的是快速排序,是排序算法中算是最优的方式了,使用sort()函数实现排序能够提高程序效率。

sort()函数源码分析

C++STL默认提供下面两种sort()函数的接口,接下来我们通过分析源码进一步理解sort()函数的使用。
第①种使用时只需要传入排序对象的迭代器起点和终点(排序范围)。

template <class _RanIt>
_CONSTEXPR20 void sort(const _RanIt _First, const _RanIt _Last) { // order [_First, _Last)
    _STD sort(_First, _Last, less<>{});
}

第②种需要传入迭代器的起点、终点(排序范围)还有谓词参数。

template <class _RanIt, class _Pr>
_CONSTEXPR20 void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) { // order [_First, _Last)
    _Adl_verify_range(_First, _Last);
    const auto _UFirst = _Get_unwrapped(_First);
    const auto _ULast  = _Get_unwrapped(_Last);
    _Sort_unchecked(_UFirst, _ULast, _ULast - _UFirst, _Pass_fn(_Pred));
}

上面是两种不同重载版本的sort()函数声明,他们接受的参数有:
_Firs指向要排序范围的起始元素的迭代器。
_Last指向要排序范围结束后的第一个元素的迭代器(即范围不包括此迭代器指向的元素)。
_Pred一个谓词,用于确定排序顺序。用户定义的谓词函数对象,定义排序中连续元素要满足的比较条件。

sort()函数不同重载版本的区别

当我们使用sort()函数时,上面介绍过了第三个参数的用途是通过使用者自定义的谓词函数对象,来确定排序方式。
在使用的时候如果没传入第三个参数时则编译器调用的是第①种方式的sort()函数,这种方式的sort()函数是默认为less<>{}(升序)的排序方式。当我们想要实现其他排序方式(升序或者其他)的话就需要传入第三个参数来实现对应的排序效果。

sort()函数的应用实例

第①种重载版本的应用实例

实现对vector对象的排序:
在这里插入图片描述
程序运行后的结果:
在这里插入图片描述

多维对象排序的应用实例

对于二维数组的排序

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
	vector<vector<int>> nums = { {5,8},{2,10},{2,6},{2,8},{1,100},{6,6},{6,1} };
	sort(nums.begin(), nums.end());
	int n = nums.size();
	for (auto num : nums)
	{
		cout << num[0]<<" "<<num[1] << endl;
	}
	return 0;
}

输出结果如下所示:
在这里插入图片描述
我们只传入了迭代器的起点和终,也就是之传入了排序的范围,所以调用的是第①种重载版本的sort()函数,通过输出结果可以发现无论对于一维的对象还是二维的对象他的排序结果都是升序,通过观察二维数组的输出结果可以发现,sort()函数的不仅对第一个下标下num[0]的数据进行了排序,还根据num[1]完成了排序,并且都是按照升序排序的。

第②种重载版本的应用实例

当我们想要实现的就不是单纯的升序排序,要实现根据自己的需求完成对数组的排序,就需要我们传入第三个参数谓词来实现修改sort()函数的排序规则,使排序规则为我们预期的效果,这个时候调用的就是上面第②种重载版本的sort()函数。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
	vector<int>nums = { 1,23,6,98,88,66,5,6};
	sort(nums.begin(), nums.end(), [](const auto& e1, const auto& e2) {return e1 > e2;}); // 这里使用了C++11种新增的特性 Lambda表达式,实现了将nums对象进行降序排序。
	int n = nums.size();
	for (int i = 0;i < n;i++)
	{
		cout << nums[i] << "	";
	}
	return 0;
}

多维对象自定义排序的应用实例

那么我们想要实现对该二维数组对象排序,排序后的结果是按照第一个数据进行升序,第二个数组进行降序该如何进行呢?

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
	vector<vector<int>> nums = { {5,8},{2,10},{2,6},{2,8},{1,100},{6,6},{6,1} };
	sort(nums.begin(), nums.end(), [](const auto& e1, const auto& e2) {return e1[0] > e2[0] || (e1[0] == e2[0] && e1[1] < e2[1]);});
	int n = nums.size();
	for (auto num : nums)
	{
		cout << num[0]<<" "<<num[1] << endl;
	}
	return 0;
}

这里的第三个参数(谓词)使用的是C++11新增的特性Lambda表达式,当然也可以使用自定义函数来实现这一效果。

[](const auto& e1, const auto& e2) {return e1[0] > e2[0] || (e1[0] == e2[0] && e1[1] < e2[1]);}

修改了二维数组的排序方式,得到的结果如图所示:
在这里插入图片描述
上面就是本文要介绍的主要内容,有相关问题可以评论提出喔!感谢阅读!

### 回答1: C++sort函数是一个标准库函数,用于对数组或容器的元素进行排序。它采用快速排序算法,是一种高效的排序算法sort函数可以接受一个比较函数,用于指定排序的方式。它的时间复杂度为O(nlogn),是一种常用的排序算法。 ### 回答2: C++标准模板库(STL)sort函数是对序列进行排序的一种算法。它采用快速排序算法,这个算法的时间复杂度为O(N*logN),其N表示序列的大小。它可以在升序和降序两种方式下进行排序,可以处理任何支持随机访问的迭代器类型的容器,如数组、deque、vector等。 sort函数使用方法很简单,在algorithm头文件,只需要调用sort(s.begin(), s.end())将容器s的元素排序即可。也可以通过参数实现自定义排序,例如使用sort(s.begin(), s.end(), cmp),其cmp是一个函数或者函数对象,用于比较两个元素的大小。 sort函数进行排序的实现过程如下: 1.将序列分割成若干子序列,默认情况下每个子序列都包含两个元素。 2.比较和交换子序列的相邻元素,保证每个子序列的第一个元素小于等于第二个元素。 3.重复步骤2,直到每个子序列只剩下一个元素。 4.合并相邻的子序列,直到只有一个序列为止。 在实现快速排序的过程sort函数使用了一些优化技巧,如随机选取pivot元素,使用三数取法等。这些技巧可以使算法的性能更好,避免特殊情况下算法的运行时间变得非常糟糕。 总之,sort函数C++非常常用的一种算法,它可以对一个序列进行排序,并且具有快速、灵活、可扩展等优点。对于处理大量数据、需要进行多次排序的情况,sort函数的效率非常高,可以大大提高程序的性能。 ### 回答3: sort函数C++ STL库的一种算法,在C语言也有相应的qsort函数sort函数主要用于对一组数据进行排序,是常见的算法之一。 sort函数的原型为: ``` void sort( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); ``` 其,first和last是随机迭代器,表示要排序的数据的起始和结束位置,闭区间[first, last)内的元素将被排序。comp是一个比较函数,用于指定元素的比较方式。如果不指定comp,则默认采用小于号<进行比较。 sort函数内部实现了快速排序(Quick Sort算法和插入排序(Insertion Sort算法两种排序算法,它们根据数据规模不同选择不同的算法,而且对小规模的数据采用了插入排序算法,使得在大多数情况下,sort函数能够快速地完成对大规模数据的排序sort函数具有以下特点: 1. 排序算法使用快速排序和插入排序两种算法。 2. 稳定性:sort函数默认使用快速排序算法,不具有稳定性。但是,使用comp参数指定了比较函数时,可以实现稳定排序。 3. 时间复杂度:最坏情况下,时间复杂度为O(nlogn)。 4. 空间复杂度:sort函数使用原地排序算法,只需要使用常数级别的额外空间。 总之,sort函数C++ STL库的一个实用工具,可以帮助我们快速地对数据进行排序,它具有快速排序、插入排序两种算法、空间复杂度小等优点,并且通过comp参数可以指定排序的方式,具有很高的灵活性和可定制性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值