您的位置:首页 > 其它

快速排序qsort()函数和二分查找bsearch()函数

2013-11-30 19:58 363 查看
qsort()函数和bsearch()函数都是C语言标准库函数,包含头文件<stdlib.h>即可调用。
在使用 qsort()函数时,需要看一下函数原型:

void qsort ( void * base, size_t num, size_t
size, int ( * comparator ) ( const void *, const void * ) );

base Pointer
to the first element of the array to be sorted.(数组起始地址)
num Number
of elements in the array pointed by base.(数组元素个数)
size Size
in bytes of each element in the array.(每一个元素的大小)
comparator Function
that compares two elements.(函数指针,指向比较函数)
1、The function must accept two parameters that are pointers to elements, type-casted as void*. These parameters should be cast back to
some data type and be compared.
2、The return value of this function should represent whether elem1 is considered less than, equal to, or greater than elem2 by returning,
respectively, a negative value, zero or a positive value.
Return Value none
(无返回值)

qsort()函数参数中有void *指针,因为void *指针作为形参,在调用qsort()函数的时候可以无条件赋值。同理 int
( * comparator ) ( const void *, const void * )该回调函数中两个形参也为void *指针。
为什么qsort()函数需要回调函数??因为C语言中没有函数模板,qsort()函数为了达到最大的通用性,即要允许对不同类型的输入进行排序,而排序本身是需要比较大小这一基本功能的,因此需要调用不同类型的比较函数,比较函数的具体代码由编程者自己实现。

回调函数::如果qsort()函数中形参没有回调函数cmp,而仅仅是在函数内部进行比较,则不能调用不同类型的比较含数据,也就是说,如果qsort()函数嵌套一个cmp()函数,那么必定是一个具体类型的函数,也就达不到通用类型的作用。

bsearch():

C语言中 bsearch 包含在<stdlib.h>头文件中,此函数可以根据你给的条件实现二分查找,如果找到元素则返回指向该元素的指针,否则返回NULL;对于有多个元素匹配成功的情况,bsearch()未定义返回哪一个。使用
bsearch 函数也要自己定义比较子函数。

函数原型

void *bsearch(const void *key, const void *base, size_t num, size_t size, int (*cmp)(const void *, const void *));


解释一下参数

key 指向要查找的元素

base 指向进行查找的数组

num 数组中元素的个数

size 数组中每个元素的大小,一般用sizeof()表示

cmp 比较两个元素的函数,定义比较规则。需要注意的是,查找数组必须是经过预先排序的,而排序的规则要和比较子函数cmp的规则相同。

因为使用bsearch函数要求数组预先排好序,所以该函数通常和快速排序函数(qsort)一起使用,关于qsort函数,详见《C语言标准库函数
qsort 详解》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: