關於Sort
Sort函數是C++ STL(Standard Template Library / 標准函數庫) <algorithm>頭文件中的一個排序函數,作用是將一系列數進行排序,因為它的排序方式類似於快排,且復雜度為O(NlogN),因此在多數情況下可以基本滿足排序的需要,相較於自己手擼快排,使用sort函數在某些情況下也是比較好的一個選擇。
使用前需引入頭文件
#include <algorithm>
基本操作說明
調用格式:sort(first, last, comp)
參數說明:
first : 待排序數組起始地址;
last : 待排序數組結束地址;
comp : 排序方式,該參數是可省參數,如果省略則以升序方式排序;
那么下面我們就來具體看看這個函數是如何使用的;
Example 1(不使用comp參數的情況)
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int main() { 6 int vec[] = { 5, 1, 9, 4, 6, 7, 2, 0, 1 }; 7 for (int i = 0; i < 9; i++) 8 cout << vec[i] << ' '; 9 cout << endl; 10 sort(vec, vec + 9); 11 for (int i = 0; i < 9; i++) 12 cout << vec[i] << ' '; 13 cout << endl; 14 15 return 0; 16 }
一段很簡單的樣例程序,結果也是顯而易見的;
5 1 9 4 6 7 2 0 1 0 1 1 2 4 5 6 7 9
上面的樣例程序是在不使用參數comp的情況下進行的排序,可以看到默認是以升序排列的,那么想要進行降序排列應該如何實現?
Example 2
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 bool comp(int a, int b) { 6 return a > b; 7 } 8 9 int main() { 10 int vec[] = { 5, 1, 9, 4, 6, 7, 2, 0, 1 }; 11 for (int i = 0; i < 9; i++) 12 cout << vec[i] << ' '; 13 cout << endl; 14 sort(vec, vec + 9, comp); 15 for (int i = 0; i < 9; i++) 16 cout << vec[i] << ' '; 17 cout << endl; 18 19 return 0; 20 }
從以上這段樣例程序中我們就可以了解到comp參數的使用方法,原來它不僅僅只是一個簡單的參數,它實際上是一個比較函數,但需要注意的是comp雖然是一個函數,但是使用時不需要返回值,這是使用規則;
那么結果當然就是以降序的方式排列元素;
5 1 9 4 6 7 2 0 1 9 7 6 5 4 2 1 1 0
以上都是對sort排序的常用操作,下面再增加一個對結構體進行排序的方法;
Example 3
假設結構體S有三個成員,對結構體進行排序的規則是:先以a進行升序排序,如果a相等則以b進行降序排序,如果b相等則以c進行降序排序;
對於這類排序實際上與正常排序並沒有不同,唯一需要改變的就是comp函數部分,以下是comp函數部分:
1 bool comp(S x, S y) { 2 if (x.a != y.a) return x.a < y.a; 3 if (x.b != y.b) return x.b > y.b; 4 return x.c > y.c; 5 }
針對排序規則比較復雜的結構體,這里我們用一個例子進行簡單說明(關於例子的詳細情況點擊這里)
排序規則如下:按總分進行降序排序,如果總分相等則以分數1進行降序排序,如果分數1相等則以序號進行升序排序;
以下是comp函數部分:
1 bool comp(Stu x, Stu y) { 2 if (x.s1 + x.s2 > y.s1 + y.s2) return true; 3 else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 > y.s1) return true; 4 else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 == y.s1 && x.num < y.num) return true; 5 else return false; 6 }