qsort bsearch 函数用法 小例

********************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 *) );
参数:第一找的关键字。第二个:要查找的数组。第三个:指定数组中元素的数目。第四个:每个元素的长度(以字符为单位)。第五个:指向比较函数的指针.key指向所要查找的元素.要查
功能: 函数用折半查找法在从 数组元素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$ 
*/


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值