二分查找法(如果看懂这个,那么C++基础基本掌握了)我们值得拥有

二分查找法实质上是不断地将有序数据集进行对半分割,并检查每个分区的中间元素。再重 复根据中间数确定目标范围并递归实行对半分割,直到中间数等于待查找的值或是目标数不在搜 索范围之内!

	#include  
	#include 

	int int_compare(const void *key1, const void *key2){
     
		const int *ch1 = (const int *)key1;
		const int *ch2 = (const int *)key2;
		return (*ch1-*ch2);
	}

	int char_compare(const void *key1, const void *key2){
      
		const char *ch1 = (const char *)key1; 
		const char *ch2 = (const char *)key2; 
		return (*ch1-*ch2);
	}

	int BinarySearch(void *sorted, int len, int elemSize, void *search, int (*compare)(const void *key1, const void *key2))
	{
     
		int left = 0, right = 0, middle = 0;

		/*初始化 left 和 right 为边界值*/ 
		left = 0; 
		right = len - 1;

		/*  循环查找,直到左右两个边界重合*/
		while(left <= right){
     
			int ret = 0;
			middle = (left + right) /2 ;
			ret = compare((char *)sorted+(elemSize*middle), search);

			if(ret == 0){
      /*middle 等于目标值*/
				/*返回目标的索引值 middle*/ 
				return middle;
			}else if( ret > 0){
      
				 /*middle 大于目标值*/ 
				/*移动到 middle 的左半区查找*/
				right = middle - 1;
			}else {
     
				/*middle 小于目标值*/
				/*移动到 middle 的右半区查找*/ 
				left = middle + 1;
			}
		}
		return -1;
	}


	int main(void){
     
		int arr[]={
     1, 3, 7, 9, 11};
		int search[] = {
     -1, 0, 1, 7 , 2, 11, 12};

		printf("整数查找测试开始。。。\n");
		for(int i=0; i<sizeof(search)/sizeof(search[0]); i++){
      
			int index = BinarySearch(arr, sizeof(arr)/sizeof(arr[0]), sizeof(int), &search[i], int_compare); 
			printf("searching %d, index: %d\n",search[i], index);
		}

	char arr1[]={
     'a','c','d','f','j'}; 
		char search1[] = {
     '0', 'a', 'e', 'j' , 'z'};

		printf("\n 字符查找测试开始。。。\n");
		for(int i=0; i<sizeof(search1)/sizeof(search1[0]); i++){
     
			int index = BinarySearch(arr1, sizeof(arr1)/sizeof(arr1[0]), sizeof(char), &search1[i], char_compare); 

			printf("searching %c, index: %d\n",search1[i], index);
		}

		system("pause"); 
		return 0;
	}

二分查找法(如果看懂这个,那么C++基础基本掌握了)我们值得拥有_第1张图片
运行效果还可以!!!

你可能感兴趣的:(笔记,技术分享,数据结构,c++,算法,数据结构,二分法)