【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)

 

 

 

 
posted @ 2015-07-27 10:07  LizSep  阅读(2168)  评论(0编辑  收藏  举报