1. 程式人生 > >sort在STL庫中是排序函數

sort在STL庫中是排序函數

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庫中是排序函數