C++STL常用操作之sort篇
简介:
#include<algorithm>
sort排序是和堆排序等一样的较快的排序方式,时间复杂度为O(n*logn)。
类似于快速排序
1.简单理解
vector:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v1;
int a;
int main() {
cout << "输入:";
for (int i = 1; i <= 5; ++i) {
cin >> a;
v1.push_back(a); //输入a并且压入到容器v1中
}
cout << "原始:";
for (int i = 0; i < 5; ++i)
cout << v1[i] << " "; //输出原始的情况
cout << endl;
sort(v1.begin(), v1.end());
cout << "排序后:";
for (int i = 0; i < 5; ++i)
cout << v1[i] << " "; //输出使用sort排序好之后的情况
cout << endl;
return 0;
}
我们看到,在使用sort之后,确实将v1排好序了。
那么sort函数是用什么作为参数的呢?
sort函数一共有三个参数,第一个是排序序列的起始位置;第二个是最后一个位置的后一个位置;第三个是排序规则,且第三个参数默认为升序规则。所以我们上述用v1的begin和end作为第一二个参数,省略了第三个参数,排好序后v1内部是升序的。
普通数组:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int x[10];
int main() {
cout << "输入:";
for (int i = 1; i <= 5; ++i)
cin >> x[i]; //输入数据
cout << "原始:";
for (int i = 1; i <= 5; ++i)
cout << x[i] << " "; //输出原始的情况
cout << endl;
sort(x + 1, x + 6); //注意这里是+6
cout << "排序后:";
for (int i = 1; i <= 5; ++i)
cout << x[i] << " "; //输出使用sort排序好之后的情况
cout << endl;
return 0;
}
注意这里我们是对数组x从下标1到5排序,但是我们在sort的第二个参数是加的6。
如果我们加5得到的结果如下:
我们发现sort只是对前四个数进行了排序,这就是我们前面提到的,第二个参数,必须是需要排序序列结束位置的后一个位置(多加上1)。
2.排序规则
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v1;
int a;
int main() {
cout << "输入:";
for (int i = 1; i <= 5; ++i) {
cin >> a;
v1.push_back(a); //输入a并且压入到容器v1中
}
cout << "原始:";
for (int i = 0; i < 5; ++i)
cout << v1[i] << " "; //输出原始的情况
cout << endl;
sort(v1.begin(), v1.end(),less<int>()); //less从小到大
cout << "从小到大:";
for (int i = 0; i < 5; ++i)
cout << v1[i] << " "; //输出使用sort排序好之后的情况
cout << endl;
sort(v1.begin(), v1.end(), greater<int>()); //greater从大到小
cout << "从大到小:";
for (int i = 0; i < 5; ++i)
cout << v1[i] << " "; //输出使用sort排序好之后的情况
cout << endl;
return 0;
}
less为从小到大,greater为从大到小。因为默认为从小到大,所以一般省略掉了第三个参数。
3.自定义规则
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Node {
int data1;
int data2;
};
vector<Node> v;
Node a;
bool cmp(Node a, Node b) {
if (a.data1 == b.data1)
return a.data2 > b.data2;
return a.data1 > b.data1;
}
//cmp将排序规则定为按照data1降序,若data1相等按data2降序
int main() {
cout << "输入:" << endl;
for (int i = 1; i <= 4; ++i) {
cin >> a.data1 >> a.data2;
v.push_back(a); //输入a并且压入到容器v1中
}
sort(v.begin(), v.end(), cmp); //按照cmp规则进行排序
cout << "结果:" << endl;
for (int i = 0; i < 4; ++i)
cout << v[i].data1 << " " << v[i].data2 << endl; //输出排好序的v1
return 0;
}
这里我们用cmp函数将排序规则定为:按照data1降序,data1相等的情况下,按照data2降序。
并且将cmp作为sort的第三个参数,就可以了。
发现问题欢迎指正!
有不懂的地方请留言!