C/C++_查找算法_二分查找

二分查找

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

参考v1.1:

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

int BinarySearch(int* sorted, int len, int search)
{
	int left = 0, right = 0, middle = 0;

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

	/* 循环查找, 直到左右两个边界重合 */
	while (left <= right)
	{
		middle = (left + right) / 2;

		if (sorted[middle] == search)
		{
			return middle;
		}
		else if (sorted[middle] > search) /* middle大于目标值 */
		{
			right = middle - 1; /* 右边: 范围向左移动 */
		}
		else if(sorted[middle] < search) /* middle小于目标值 */
		{
			left = middle + 1; /* 左边: 范围向右移动 */
		}
	}

	return -1;
}

int main()
{
	int arr[] = { 1,3,7,9,11 };
	int search = 10;

	int index = BinarySearch(arr, sizeof(arr) / sizeof(arr[0]), search);

	printf("index: %d\n", index);

	system("pause");
	return 0;
}

运行环境: vs 2019
运行结果:
在这里插入图片描述
参考v1.2:

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

int BinarySearch(int* sorted, int len, int search)
{
	int left = 0, right = 0, middle = 0;

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

	/* 循环查找, 直到左右两个边界重合 */
	while (left <= right)
	{
		middle = (left + right) / 2;

		if (sorted[middle] == search)
		{
			return middle;
		}
		else if (sorted[middle] > search) /* middle大于目标值 */
		{
			right = middle - 1; /* 右边: 范围向左移动 */
		}
		else if(sorted[middle] < search) /* middle小于目标值 */
		{
			left = middle + 1; /* 左边: 范围向右移动 */
		}
	}

	return -1;
}

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

	for (int i = 0; i < sizeof(search) / sizeof(search[0]); i++)
	{
		int index = BinarySearch(arr, sizeof(arr) / sizeof(arr[0]), search[i]);
		printf("查找: %d index: %d\n", search[i], index);
	}
	

	system("pause");
	return 0;
}

运行环境: vs2019
运行结果:
在这里插入图片描述
参考v1.3:

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



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)
		{
			return middle;
		}
		else if (ret > 0)
		{
			right = middle - 1;
		}
		else
		{
			left = middle + 1;
		}
		
	}

	return -1;
}

int main()
{
	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("查找: %d index: %d\n", search[i], index);
	}

	printf("字符查找测试开始\n");
	char arr1[] = { 'a','c','d','f','j' };
	char search1[] = { '0','a','d','e','j' };
	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("查找: %c index: %d\n", search1[i], index);
	}
	
	system("pause");
	return 0;
}

运行环境: vs2019
运行结果:
在这里插入图片描述

结语:

学到的知识要, 多复习, 多总结, 多敲. 需要时间的积累, 才能引起质的改变. 自己写不出来的永远是别人的.

分享一下我的技巧: 代数法把具体的数字带进去, 看看能能能找到规律(掌握思想).
还有就是画图, 也很重要. 用笔画出来, 把数代进去, 方法虽然笨, 但真的很实用, 好记忆不如烂笔头!!! 还有多用debug(调试工具)

我是小白, C/C++功力…, 你懂得, 写的文章可能不是很好. 如果存在问题, 欢迎大神给予评判指正.
错了不可怕, 可怕的是找不出bug, 谁没错过!!!

最近学操作系统我认为, 学什么都要成本(时间), 即使它是免费的, 我个人认为要挑来学, 挑重点来学, 而不是从头到尾, 除非考试考研.

这个知识点我没有完全掌握, 就是会了也要复习, 革命尚未成功, 同志还需努力!!! , 我会回来反复复习的

今日是: 2020年5月17日, (由于疫情的原因)现在没有返校. 写博客,也可自己加强记忆,就当写写日记吧!!!

希望给个赞: 反正你又不亏, 顺便而已

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值