stdlib.h中自带的两个算法qsort,bsearch
2016-05-23 16:35
302 查看
http://zh.cppreference.com/w/c/algorithm
==========
ptr:指向要排序的数组头部
count:数组中元素的数量
size:数组中每个元素的大小
comp:比较函数。
如果前者小于后者,返回一个负数值;
如果前者大于后者,返回一个正数值;
如果前者和后者相等,返回零。
比较函数的原型应该,等价于下面的:
这个函数不能修改 被传递的参数,
当a/b两者的是相同的对象时,返回稳定的结果。consisten result,而不管在数组他们的位置。
例子:
===
sort中的比较函数cmp在c++中,注意要声明为静态成员(如果是在class类中)函数或者全局函数,不能作为普通成员函数,负责会出错--->qsort invalid use of non-static member function。
因为:非静态成员函数是依赖于具体对象的,而qsort这类函数是全局的,因此无法在qsort中调用非静态成员函数。
静态成员函数或者全局函数是不依赖于具体对象的,可以独立访问,不用创建对象实例就可以访问。
同时,静态成员函数不能调用类的非静态成员。
=========
bsearch
要求是有序的,
key,指向查找元素的指针
ptr,指向待查找的数组
count,数组中的元素个数
size,数组中元素的大小
comp,比较函数,与qsort要求的比较函数一样。
返回值:返回一个指针,指向数组中等于*key的元素; 或者返回null,如果没有找到这个数组。
例子:
==========
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; } };
相关文章推荐
- react 与 jquery
- 【神经网络】:一篇很好的介绍感知机的文章(至少可以做作业了)
- 初识NoSQL
- [HDU2157]How many ways??(矩阵乘法)
- 函数对象为构造函数参数时
- 如何将pdf图片转换成jpg
- Android N Preview 行为变更
- OkHttp源码分析之基本框架2
- Linux线程间同步机制_条件变量
- .c文件如何编译为ko的MAKEFILE文件编写
- C#读取目录下的某一格式的文件
- JVM底层又是如何实现synchronized
- 输入相关函数
- AbstractIdleService服务类用法
- Hadoop学习
- Fragment相关研究
- c++相关链接总结
- LinuxC/C++编程(3)—异步清理子进程(避免成为僵尸进程)
- 用TeXStudio打开WinEdt Latex中文乱码的解决办法
- Java设计模式之单例模式