對於一個有N個元素的數組/vector,如果N比較小,要進行排序,此時可以考慮C語言中的庫函數qsort、C++中的sort函數,二者是基於快速排序的函數。(具體原理待后續需要再詳細了解,只考慮其簡單用法)
最初了解是在Tsinghua DSA的PA作業中,因為規定了不能用STL,得自己寫函數實現數據結構的一些功能。但有些C語言中的庫函數又可以用,其中就有用來排序的qsort。當時並不知道這是什么,只是參照別人的代碼加以利用了這個函數,可以排序就沒有再去深入了解了。現在做上機題,看到一個只有5個數的vector需要進行排序,提示是用了qsort。搜索之后又看到了更簡單好用的sort,暫時記下這兩個函數的簡單用法。
C語言中的qsort函數,需要加上頭文件stdlib.h
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
base是要排序的對象的起始地址,num是排序對象的大小,size是排序對象的數據類型所占的字節數,compar是比較函數。
比較函數需要自己手動寫,比較的是什么數據類型,對應的cmp函數return時,a,b指針指向的就是什么類型。
如果比較的是char類型的數組,因為依據的是字符的ASCII碼值,所以返回類型依舊是int,return時a,b的類型強制轉換成(char *)。
如果比較的是double類型的數組,return的是兩個數的大小比較結果。
1 #include <stdlib.h> 2 #include <iostream> 3 4 using namespace std; 5 6 int cmp(const void *a, const void *b){ 7 return *(int *)a - *(int *)b; //進行升序排序,降序a,b位置互換 8 } 9 10 int main(){ 11 int arr[] = {1, 5, 3, 1, 4, 2}; 12 qsort(arr, 6, sizeof(int), cmp); 13 for (int i = 0; i < 6; i++) 14 cout << arr[i] << " "; 15 return 0; 16 }
C++中的std::sort函數,使用較qsort方便。
使用時,要加頭文件algorithm
第1種形式,用默認的排序函數(升序):
template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last);
傳入的參數只有兩個,迭代器的起始和終止地址,該范圍的區間是[begin,end)
1 #include <algorithm> 2 #include <iostream> 3 4 using namespace std; 5 6 int main(){ 7 vector<int> arr{5,4,3,2,1}; 8 sort(arr.begin(), arr.end()); 9 10 for (int i = 0; i < arr.size(); i++) 11 cout << arr[i] << " "; 12 return 0; 13 }
第2種形式,自己寫比較函數
template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
1 #include <iostream> 2 #include <algorithm> 3 #include <functional> 4 #include <vector> 5 using namespace std; 6 7 class myclass { 8 public: 9 myclass(int a, int b):first(a), second(b){} 10 int first; 11 int second; 12 bool operator < (const myclass &m)const { 13 return first < m.first; 14 } 15 }; 16 17 bool less_second(const myclass & m1, const myclass & m2) { 18 return m1.second < m2.second; 19 } 20 21 int main() { 22 23 vector< myclass > vect; 24 for(int i = 0 ; i < 10 ; i ++){ 25 myclass my(10-i, i*3); 26 vect.push_back(my); 27 } 28 for(int i = 0 ; i < vect.size(); i ++) 29 cout<<"("<<vect[i].first<<","<<vect[i].second<<")\n"; 30 sort(vect.begin(), vect.end()); 31 cout<<"after sorted by first:"<<endl; 32 for(int i = 0 ; i < vect.size(); i ++) 33 cout<<"("<<vect[i].first<<","<<vect[i].second<<")\n"; 34 cout<<"after sorted by second:"<<endl; 35 sort(vect.begin(), vect.end(), less_second); 36 for(int i = 0 ; i < vect.size(); i ++) 37 cout<<"("<<vect[i].first<<","<<vect[i].second<<")\n"; 38 39 return 0 ; 40 }
第2種形式例子來源於 詳細解說 STL 排序(sort)