C++STL常用操作之sort篇

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的第三个参数,就可以了。


发现问题欢迎指正!

有不懂的地方请留言!

猜你喜欢

转载自blog.csdn.net/qq_45985728/article/details/113048880