sort 在 STL 庫中是排序函數,有時冒泡、選擇等 $\mathcal O(n^2)$ 算法會超時時,我們可以使用 STL 中的快速排序函數 $\mathcal O(n \ log \ n)$ 完成排序
sort 在 algorithm 庫里面,原型如下:
template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
我們會發現 sort 有兩種形式一個有三個參數,一個有兩個參數,我們先講講兩個參數的吧!
sort 的前兩個參數是起始地址和中止地址
如:sort(a,a+n) 表示對 a[0] ... a[n-1] 排序
代碼如下:
#include <algorithm>
#include <cstdio>
using namespace std;
int main() {
int n,a[1001];
scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1); //對a[1] ... a[n] 排序
for (int i = 1;i <= n;i++) printf("%d",a[i]);
return 0'
}
這樣是默認升序的,那如果是降序呢?
這樣,我們就要用到第三個參數,第三個參數是一個比較函數
bool cmp(int a,int b) { return a > b; }
這個就是降序排序的比較函數,意思是:
是 a > b 時為true,就不交換,a < b 時為 false,交換
然后我們調用 sort(a+1,a+n+1,cmp) 就可以對 a 數組進行排序了
還可以調用 greater 和 less 進行升/降序排序,其實就是一個幫你寫好的函數
int a[11],n; scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1,greater<int>()); //升序
sort(a+1,a+n+1,less<int>()); //降序,注意尖括號內寫的是排序的數組類型
sort 也能對結構體排序,如:
#include <algorithm>
#include <cstdio>
using namespace std;
struct Node {
int x,y;
} p[1001];
int n;
bool cmp(Node a,Node b) {
if (a.x != b.x) return a.x < b.x;
return a.y < b.y;
}
int main() {
scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y);
sort(p+1,p+n+1,cmp);
for (int i = 1;i <= n;i++) scanf("%d %d\n",p[i].x,p[i].y);
return 0;
}
以上代碼的意思是,對 p 數組按 x 升序排序,若兩個數的 x 相等則按 y 升序排序
結構體還可以重載運算符(greater 和 less 都是重載運算符的),使 sort 只用兩個參數就可以按自己的規則排序,如:
#include <algorithm>
#include <cstdio>
using namespace std;
struct Node {
int x,y;
bool operator < (Node cmp) const {
if (a.x != cmp.x) return a.x < cmp.x;
return a.y < cmp.y;
}
}p[1001];
int n;
/*bool cmp(Node a,Node b) { * if (a.x != b.x) return a.x < b.x; * return a.y < b.y; *} */
int main() {
scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y);
sort(p+1,p+n+1);
for (int i = 1;i <= n;i++) scanf("%d %d\n",p[i].x,p[i].y);
return 0;
}