1. 程式人生 > 其它 >C++STL常用操作之sort篇

C++STL常用操作之sort篇

技術標籤:快速學習STL演算法資料結構

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的第三個引數,就可以了。


發現問題歡迎指正!

有不懂的地方請留言!