【STL】C中的qsort與C++中的sort


對於一個有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)

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM