相同点:
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个的位置被排对了,其他的不管。