比较sort和nth_element两个函数的不同

相同点:
sort()和nth_element()都包含在#include<algorithm>头文件中

sort()
函数原型:
void sort (RandomAccessIterator begin, RandomAccessIterator end, Compare comp);
begin:表示排序的起始位置(迭代器类型)
end:表示排序的结束位置(迭代器类型)
comp:表示排序的类型(升序或者降序)
升序排序不传入第三个参数,默认升序排序。程序和运行结果如下:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main() {
	vector<int> nums = { 1,-1,9,2,0,15,-17,23 };
	cout << "排序前数组元素顺序为:" << endl;
	for (const int i : nums)cout << i << " ";
	cout << endl;
	sort(nums.begin(), nums.end());
	cout << "升序后数组元素顺序为:" << endl;
	for (const int i : nums)cout << i << " ";
	return 0;
}

在这里插入图片描述
降序时需要传入第三个参数,代码和运行结果如下:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
bool compare(int a,int b) {
	return (a > b);
}
int main() {
	vector<int> nums = { 1,-1,9,2,0,15,-17,23 };
	cout << "排序前数组元素顺序为:" << endl;
	for (const int i : nums)cout << i << " ";
	cout << endl;
	sort(nums.begin(), nums.end(), compare);
	cout << "降序后数组元素顺序为:" << endl;
	for (const int i : nums)cout << i << " ";
	return 0;
}

在这里插入图片描述
nth_element()
函数原型:

void nth_element(RandomAccessIterator beg, RandomAccessIterator nth, RandomAccessIterator end)
void nth_element(RandomAccessIterator beg, RandomAccessIterator nth, RandomAccessIterator end, RandomAccessIterator BinaryPredicate op)

一般来说常用第一种,因为参数少简单呀!
但是在这里还说明一下两者的不同,不然后面自己回来看都忘记了

第一形式使用默认operator < 作为排序准则。
第二形式使用binary predicate op(elem1,elem2)作为排序准则。

下面直接上代码,看了代码就好理解了,注意,我平时用的都是vs2017,在得到结果后我发现,结果与我预期的不一样。vs2017居然把数组全部排序好给我输出了,并没有按照中间元素进行左右两边对换。

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int compare(int a, int b) {
	return (a > b);
}
int main() {
	vector<int> nums = { 1,-1,9,2,0,15,-17,23 };
	cout << "排序前数组元素顺序为:" << endl;
	for (const int i : nums)cout << i << " ";
	cout << endl;
	nth_element(nums.begin(),nums.begin()+nums.size()/2,nums.end(), compare);
	cout << "根据中间元素左右排序后数组元素顺序为:" << endl;
	for (const int i : nums)cout << i << " ";
}

在这里插入图片描述
使用devcpp编译器需要修改部分代码,修改后的代码如下

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int compare(int a, int b) {
	return (a < b);
}
int main() {
	vector<int> nums;
	nums.push_back(1);
	nums.push_back(-1);
	nums.push_back(9);
	nums.push_back(2);
	nums.push_back(0);
	nums.push_back(15);
	nums.push_back(-17);
	nums.push_back(23);
	cout << "排序前数组元素顺序为:" << endl;
	int i;
	for(i=0;i<nums.size();i++)cout<<nums[i]<<" ";
	cout << endl;
	nth_element(nums.begin(),nums.begin()+nums.size()/2,nums.end(), compare);
	cout << "根据中间元素左右排序后数组元素顺序为:" << endl;
	for(i=0;i<nums.size();i++)cout<<nums[i]<<" ";
	return 0;
}

在这里插入图片描述

很明显,2为中间元素,只有2的位置肯定是对的

nth_element()是一个典型的部分排序算法。
它的第1和第3个参数,定义的是排序的范围(或则说nth_element这个算法或函数的作用范围),begin和end,是一个[ )区间。
第2个参数的意思是:如果给你一堆数据,需要确定中间值是多少,第2大的数是什么?全排序当然可以,但如果数据多,效率也许就差了。这是只有部分排序即可,也就是说只有这第n个的位置被排对了,其他的不管。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小峰呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值