C++STL常用操作之sort篇
阿新 • • 發佈:2021-02-01
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的第三個引數,就可以了。
發現問題歡迎指正!
有不懂的地方請留言!