查找算法02-二分法查找

知识分享:热门博客

2、二分法查找

说明: 元素必须是有序的,如果是无序的则要先进行排序操作。
基本思想: 也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
复杂度分析: 最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n);

2-1实现代码

  • Java实现方式一:
public static int binarySearch1(int[] array,int value) {
		int low=0;
		int high=array.length-1;
		while(low<=high) {
			int middle=low+((high-low)>>1);
			if(value==array[middle])
				return middle;
			if(value>array[middle])
				low=middle+1;
			else 
				high=middle-1;
		}
		return -1;
	}
  • Java实现方式二:
    public static int binarySearch2(int[] array,int value) {
		int low=0;
		int high=array.length-1;
		return search(array,low,high,value);
	}
	private static int search(int[] array,int low,int high,int value) {
		if(low>high)
			return -1;
		int mid=low+((high-low)>>1);
		if(value==array[mid])
			return mid;
		if(value<array[mid])
			return search(array,low,mid-1,value);
		return search(array,mid+1,high,value);
	}

2-2测试

		int arr[]= {1,2,3,4,5,6,7,8,9,10};
		int result1=binarySearch1(arr,9);
		System.out.println("result = "+result1); //输出下标
		int result2=binarySearch2(arr,9);
		System.out.println("result2 = "+result2);  //输出下标

输出结果:
在这里插入图片描述

2-3方法解析

二分查找: 适用于大的数据,但前提条件是数据必须是有序的,它的原理是先和中间的比较,如果等于就直接返回,如果小于就在前半部分继续使用二分法进行查找,如果大于则在后半部分继续使用二分法进行查找。
方式一: while循环实现。
方式二: 采用递归的思想来实现。

上篇博文:查找算法01-顺序查找
下篇博文:查找算法03-插值查找

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Dev-C++实现顺序查找算法二分法查找算法的示例代码: ```c++ #include <iostream> #include <vector> #include <algorithm> using namespace std; // 顺序查找算法 int seqSearch(vector<int>& nums, int target) { for (int i = 0; i < nums.size(); i++) { if (nums[i] == target) { return i; } } return -1; // 查找失败 } // 二分法查找算法 int binarySearch(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; // 查找失败 } int main() { vector<int> nums = {3, 5, 2, 8, 4, 7, 1, 6}; sort(nums.begin(), nums.end()); // 二分法查找算法需要有序表 int target = 4; int index1 = seqSearch(nums, target); // 调用顺序查找算法 int index2 = binarySearch(nums, target); // 调用二分法查找算法 if (index1 != -1) { cout << "顺序查找成功,目标元素下标为:" << index1 << endl; } else { cout << "顺序查找失败,未找到目标元素" << endl; } if (index2 != -1) { cout << "二分法查找成功,目标元素下标为:" << index2 << endl; } else { cout << "二分法查找失败,未找到目标元素" << endl; } return 0; } ``` 以上代码中,我们使用了STL中的vector容器来存储顺序表元素,并使用sort函数对其进行排序,以便二分法查找算法能够正确执行。在main函数中,我们分别调用了顺序查找算法二分法查找算法查找目标元素的值为4。最后,根据返回的下标值,输出查找结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值