二分查找/折半查找------算法思想

本文详细介绍了二分查找(折半查找)算法,如何利用其在已排序数组中快速定位数字,通过示例和代码展示其实现步骤,对比传统查找法,提高搜索效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分查找/折半查找(此方法仅用于顺序排列)

该算法是高效的找出数字方法

假设n个数  次数=log2n  如找232次个数,只需要32

步骤:
1.设 left=初始位底数(0),right=最后一位底数,mid=left+(right-left)/2
2.不断的通过折半,来比较与想要找的数字(k)
3.如果a[mid]>k,则mid显然在k的左边,left=mid+1; 如果a[mid]<k,则mid显然在k的右边,right=mid-1;
反复重复1,2,3步骤,当a[mid]=k,则找到数字k,即输出mid底数

如a[10]={1,2,3,4,5,6,7,8,9,10} 找到数组中的一个数,输出它的底数
如找数字7,输出显示底数6
left=0,right=9,mid=left+(right-left)/2=4,此时a[mid]=5<7,left=mid+1=5
left=5,right=9,mid=left+(right-left)/2=7,此时a[mid]=8>7,right=mid-1=7
left=5,right=7,mid=left+(right-left)/2=6,此时a[mid]=7=7,输出mid

如果用正常的找法,从第一位开始找的话,需要7次才能找到,大大的降低了效率

#define _CRT_SECURE_NO_WARNINGS 1
int main(){
	int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	printf("请输入你想要的数字:");
	int k;
	scanf("%d",&k);//输入你想要的数字
	int left = 0;
	int right = 9;
	while (left <= right){//比较左右大小来得到想要数字的底数
		int mid = left+(right-left)/2;
		if (a[mid] < k){
			left = mid + 1;
		}
		else if (a[mid]>k){
			right = mid - 1;
		}
		else{
			printf("它的底数是:%d\n", mid);
			break;
		}
	}
	if (left > right){
		printf("找不到奥!\n");
	}

	return 0;
}
折半查找(也称为二分查找)是一种高效的查找算法,主要用于在有序数组中查找特定元素的位置。其基本思想是将查找范围不断对半分,直到找到目标元素或确定目标元素不在数组中。 折半查找的步骤如下: 1. **初始化**:设定两个指针,分别指向数组的起始位置和结束位置。 2. **中间值**:计算中间位置的值。 3. **比较**:将目标值与中间位置的值进行比较。 - 如果目标值等于中间位置的值,查找成功,返回中间位置。 - 如果目标值小于中间位置的值,调整结束指针为中间位置减一。 - 如果目标值大于中间位置的值,调整起始指针为中间位置加一。 4. **重复**:重复上述步骤,直到找到目标元素或起始指针大于结束指针。 下面是一个简单的Python代码示例: ```python def binary_search(arr, target): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 # 如果未找到目标元素 # 示例数组 arr = [1, 3, 5, 7, 9, 11, 13] target = 7 result = binary_search(arr, target) if result != -1: print(f"元素 {target} 在数组中的索引位置为: {result}") else: print("元素不在数组中") ``` 在这个示例中,数组`arr`是有序的,目标元素`target`是7。通过折半查找算法,我们可以在`O(log n)`的时间复杂度内找到目标元素的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值