• 【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<<")
    ";
    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<<")
    ";
    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<<")
    ";
    38         
    39         return 0 ;
    40 }
    
    

    第2种形式例子来源于 详细解说 STL 排序(sort)

     
     
  • 相关阅读:
    package.json文件
    Node.js中模块加载机制
    第三方模块
    系统模块
    Node.js快速入门及模块化开发
    String 的扩展方法
    ES6 的内置对象扩展
    箭头函数
    解构赋值
    let、const、var 的区别
  • 原文地址:https://www.cnblogs.com/cnblogsnearby/p/4679407.html
Copyright © 2020-2023  润新知