********************baidubaike********************
bsearch 二分法
用 法: void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int(*fcmp)(const void *, const *));
语法:
#include <
stdlib.h>
void *bsearch( const void *key, const void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );
功能: 函数用折半查找法在从
数组元素buf[0]到buf[num-1] 匹配参数key。如果函数compare 的第一个参数小于第二个参数,返回负值;如果等于返回零值;如果大于返回正值。
数组buf 中的元素应以升序排列。函数bsearch()的返回值是指向匹配项,如果没有发现匹配项,返回NULL
qsort 功 能: 使用快速排序例程进行排序
*****************************************************************baidu baike*************************************************************************
用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
使用qsort()排序并用 bsearch()搜索是一个比较常用的组合,使用方便快捷。
其中base是排序的一个集合
数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数。
比如:对一个长为1000的
数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
qsort(a,1000,sizeof(int),comp);
其中comp函数应写为:
1
2
3
4
|
intcomp(constvoid*a,constvoid*b)
{
return
*(
int
*)a-*(
int
*)b;
}
|
上面是由小到大排序,return *(int *)b - *(int *)a; 为由大到小排序
对一个
二维数组进行排序:
int a[1000][2]; 其中按照a[0]的大小进行一个整体的排序,其中a[1]必须和a[0]一起移动交换。
//即第一行和第二行(a[0]和a[1]分别代表第一行和第二行的首地址)
1
2
3
4
5
6
7
8
9
10
11
12
|
qsort
(a,1000,
sizeof
(
int
)*2,comp);
intcomp(constvoid*a,constvoid*b)
{
return
((
int
*)a)[0]-((
int
*)b)[0];
}
|
**************************************************************************************************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LEN 5
void arr_init(int num[], int len)
{
int i;
srand(time(NULL));
for(i = 0; i < len; i++){
num[i] = rand()%50;
}
}
void arr_print(int num[], int len)
{
int i;
for(i = 0; i < len; i++){
printf("%d ", num[i]);
}
printf("\n");
}
int cmp_int(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main(void)
{
int num[LEN];
int fd;
int *find_num;
arr_init(num, LEN);
arr_print(num, LEN);
qsort(num, LEN, sizeof(int), cmp_int);
arr_print(num, LEN);
printf("enter search num:\n");
scanf("%d", &fd);
find_num = (int *)bsearch(&fd, num, LEN, sizeof(int), cmp_int);
(find_num == NULL) ? printf("no find\n") : printf("find the num %d\n", fd);
return 0;
}
/*
akaedu@akaedu-G41MT-D3:~/lin/804_sf$ ./4
27 38 2 23 3
2 3 23 27 38
enter search num:
3
find the num 3
akaedu@akaedu-G41MT-D3:~/lin/804_sf$ ./4
0 5 48 17 19
0 5 17 19 48
enter search num:
66
no find
akaedu@akaedu-G41MT-D3:~/lin/804_sf$
*/