sort在STL庫中是排序函數
阿新 • • 發佈:2017-11-12
operator 相等 bool 降序排序 string 數列 lin keyword compare
sort在STL庫中是排序函數,有時冒泡、選擇等O(N^2)算法會超時時,我們可以使用STL中的快速排序O(N log N)完成排序
sort在<algorithm>庫裏面,原型如下:
1 2 3 4 |
template < class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );
template < class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); |
他有兩種形式一個有三個參數,一個有兩個參數,我們先講講兩個參數的吧!
sort的前兩個參數是起始地址和中止地址
如:sort(a,a+n) 表示對a[0] a[1] a[2] ... a[n-1] 排序
代碼如下:
1 2 3 4 5 6 7 8 9 10 11 |
#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[2] a[3] ... a[n] 排序
for ( int i = 1;i <= n;i++) printf ( "%d" ,a[i]); //輸出
return 0‘
}
|
這樣是默認升序的,那如果是降序呢?
這樣,我們就要用到第三個參數,第三個參數是一個比較函數
1 2 3 |
bool cmp( int a, int b) {
return a > b;
}
|
這個就是降序排序的比較函數,意思:
是a > b時為true,就不交換,a < b時為false,交換
然後我們調用sort(a+1,a+n+1,cmp);就可以對a[1] a[2] a[3] ... a[n] 進行排序了
sort也能對結構體排序,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <algorithm>
#include <cstdio>
using namespace std;
struct Node {
int x,y;
}p[1001];
int n;
int cmp(Node a,Node b) {
if (a.x != b.x) return a.x < b.x; //如果a.x不等於b.x,就按x從小到大排
return a.y < b.y; //如果x相等按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;
}
|
以上代碼的意思是,如果a.x不等於b.x,就按x從小到大排;如果x相等按y從小到大排
結構體還可以重載運算符,使sort只用兩個參數就可以按自己的規則排序,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#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;
//int cmp(Node a,Node b) {
// if (a.x != b.x) return a.x < b.x; //如果a.x不等於b.x,就按x從小到大排
// return a.y < b.y; //如果x相等按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;
}
|
sort在STL庫中是排序函數