• stdlib.h中自带的两个算法qsort,bsearch


    http://zh.cppreference.com/w/c/algorithm

    ==========

    void qsort( void *ptr, size_t count, size_t size,
                int (*comp)(const void *, const void *) );

    ptr:指向要排序的数组头部

    count:数组中元素的数量

    size:数组中每个元素的大小

    comp:比较函数。

       如果前者小于后者,返回一个负数值;

       如果前者大于后者,返回一个正数值;

       如果前者和后者相等,返回零。

      比较函数的原型应该,等价于下面的:

    int cmp(const void *a,const void *b);

    这个函数不能修改 被传递的参数,

    当a/b两者的是相同的对象时,返回稳定的结果。consisten result,而不管在数组他们的位置。

    例子:

    class A{
    public:
    static int mycmp(const void *a,const void *b){
            int arg1 = *(const int *)a;
            int arg2 = *(const int *)b;
            if(arg1<arg2) return -1;
            if(arg1>arg2) return 1;
            return 0;
        }
    
        void test(ListNode *head){
            int *a = new int[15];
            for(int i = 0;i<15;i++){
                a[i] = rand()%15+1;///1..15
            }
            for(int i = 0;i<15;i++){
                cout<<a[i]<<" ";
            }cout<<endl;
            qsort(a,15,sizeof(int),mycmp);
            for(int i = 0;i<15;i++){
                cout<<a[i]<<" ";
            }cout<<endl;
        }  
    };

    ===

    sort中的比较函数cmp在c++中,注意要声明为静态成员(如果是在class类中)函数或者全局函数,不能作为普通成员函数,负责会出错--->qsort invalid use of non-static member function。

    因为:非静态成员函数是依赖于具体对象的,而qsort这类函数是全局的,因此无法在qsort中调用非静态成员函数。

    静态成员函数或者全局函数是不依赖于具体对象的,可以独立访问,不用创建对象实例就可以访问。

    同时,静态成员函数不能调用类的非静态成员。

    =========

    bsearch

    void* bsearch( const void *key, const void *ptr, size_t count, size_t size,
                   int (*comp)(const void*, const void*) );

    要求是有序的,

    key,指向查找元素的指针

    ptr,指向待查找的数组

    count,数组中的元素个数

    size,数组中元素的大小

    comp,比较函数,与qsort要求的比较函数一样。

    返回值:返回一个指针,指向数组中等于*key的元素; 或者返回null,如果没有找到这个数组。

    例子:

    class A{
    public:
    static int mycmp(const void *a,const void *b){ return *(int *)a - *(int *)b; } void test(ListNode *head){ int a[10]; for(int i = 0;i<10;i++){ a[i] = i; } int b[2] = {7,2}; int *v = nullptr; v = (int *)bsearch(b,a,10,sizeof(int),mycmp); cout<<*v<<endl; } };

      

  • 相关阅读:
    IOS回调机制总结
    2.25~当svn服务器ip地址变了怎么办?
    ubuntu硬件信息,内存DDR详细信息
    关于JS相等比较算法(==)的原理
    ubuntu更改鼠标滚轮方向为自然方向(运动方向和滚轮滚动方向一致)
    C#模拟js的Json对象创建,操作
    关于json返回日期格式化的解决方案
    js定时器 timer
    ubuntu GUI界面复制文件没权限的解决方案
    CodeSmith 模板
  • 原文地址:https://www.cnblogs.com/li-daphne/p/5520309.html
Copyright © 2020-2023  润新知