C语言标准函数 qsort() bsearch()

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

#define SIZE 1000000

int compare_int (const void *a, const void *b) {
	return *(int *)a - *(int *)b;
}

int compare_char (const void *a, const void *b) {
	return strcmp((char *)a,(char *)b);
}

int arr_int[SIZE];
char arr_char[SIZE][5] = { "cat", "car", "cab", "cap", "can" };

typedef struct node{
	int a[9];
}Node;

int compare_iarr (const void *a, const void *b) {
	return *(int *)a - *(int *)b;
}

int main () {
	
	int n;
	int i;
	
	//int arr的运用
	printf("int arr的运用\n"); 
	Node a[10000];
	n = 100;
	int j;
	for(i = 0; i < n; i ++){
		for(j = 0; j < 9; j ++){
			a[i].a[j] = rand()%100;
		}
	}
/*	for(i = 0; i < n; i ++){
		for(j = 0; j < 9; j ++){
			printf("%d ", a[i].a[j]);
		}
		printf("\n");
	}*/
	qsort(a, n, sizeof(a[0]), compare_iarr);
	
/*	printf("\n");
	for(i = 0; i < n; i ++){
		for(j = 0; j < 9; j ++){
			printf("%d ", a[i].a[j]);
		}
		printf("\n");
	}*/
	Node nod = {41,47,34,1,1,1,1,1,1};
	
	if((Node *)bsearch(&nod, a, n, sizeof(a[0]), compare_iarr) != NULL)
		printf("yes");
	
	int t1, t2;
	int ci = 0;
	t1 = clock();
	while(ci < 100000){
		qsort(a, n, sizeof(a[0]), compare_iarr);
		if((Node *)bsearch(&nod, a, n, sizeof(a[0]), compare_iarr) != NULL)
			;
		ci ++;
	}t2 = clock();
	printf("--%d--", t2 - t1);//对于 循环次数多且排序搜索集合大的仍然很慢,必须用记忆搜索 内存换时间 
		
		
	//整形排序运用 
	printf("\n整形排序运用 \n"); 
	n = 5;
	for(i = 0; i < n; i ++){
		arr_int[i] = rand()%100;
	}arr_int[3] = 41;
	for(i = 0; i < n; i ++){
		printf("%d ", arr_int[i]);
	}printf("\n");
	
	qsort(arr_int, n, sizeof(arr_int[0]), compare_int);
	
	for(i = 0; i < n; i ++){
		printf("%d ", arr_int[i]);
	}printf("\n");
	
	//	bsearch() 二元搜索
	/*
	key指向所要查找的元素,base指向进行查找的数组,nmem为查找长度,
	一般为数组长度,size为每个元素所占的字节数,一般用sizeof(...)表示,
	comp指向比较子函数,它定义比较的规则。需要注意的是,数据必须(注意是必须)是经过预先排序的(因为选择compace后,它默认已经排序),
	而排序的规则要和comp所指向比较子函数的规则相同。如果查找成功则返回数组中匹配元素的地址,
	反之则返回空。对于有多于一个的元素匹配成功的情况,bsearch()未定义返回哪一个。
	cur 返回数组对于的 key指向所要查找的元素的最后出现的位置 
	*/
	
	int key = 91;
	int *cur;
	cur = (int *)bsearch(&key, arr_int, n, sizeof(int), compare_int);
	if(cur == NULL)	//key在数组里面则不为BULL
		 printf("%d不在函数里面\n", key);
	else
		 printf("%d在函数里面\n", key);
	for(i = 0; i < n; i ++){
		if(arr_int + i == cur)
			printf("位子是%d\n\n", i);
	}
	
	
	//字符串排序运用 
	printf("字符串排序运用 \n"); 
	n = 5;
	for(i = 0; i < n; i ++){
		printf("%s ", arr_char[i]);
	}printf("\n");
	
	qsort(arr_char, n, sizeof(arr_char[0]), compare_char);
	
	for(i = 0; i < n; i ++){
		printf("%s ", arr_char[i]);
	}printf("\n");
	
	char *cu;
	char str[5] = {"cat"};
	cu = (char *)bsearch(str, arr_char, n, sizeof(str), compare_char);
	if(cu != NULL)
	printf("yes");
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值