二分查找程序实现

二分查找程序实现

使用二分法的前提是有序数组

有点麻烦并且low的写法
用while循环实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0])-1;
	int key = 0;
	scanf("%d", &key);
	int mid = 0;

	while (left <= right)
	{
		mid = left + (right - left) / 2;

		if (arr[mid] > key)
		{
			right = mid - 1;

		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}

		else
		{
			break;
		}
	}
		//跳出循环 找到了从break跳出的 mid=key 或者是l不满足循环条件eft>right(即为找不到key)跳出了循环
		if (left <= right)
		{
			printf("找到了关键字位于为arr[%d]",mid);
		}
		else
		{
			printf("没有找到");
		}
	
	

	system("pause");
	return 0;
}

进阶版:建立Binary search 函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int BinarySearch(int arr[], int key, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}

		else
		{
			return mid;//找到了直接返回mid
		}
	}
		return -1;//没找到返回-1
	
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int key = 0;
	scanf("%d", &key);
	int ret = 0;
	int sz = sizeof(arr)/ sizeof(arr[0]);
	ret = BinarySearch(arr, key, sz);
	if (-1==ret)
	{
		printf("没有找到");
	}
	else
	{
		printf("找到了关键字位于为arr[%d]", ret);
	}

	system("pause");
	return 0;
}

在这里插入图片描述
建立二分法的函数,在函数里面实现循环
1.循环判断的条件:
为什么不写死循环??
如果找不到的条件下,right会移动到left 的前面,此时,程序会一直等待不会退出了。
while (left <= right)

2.不能用return 0 万一数组下标0 就是要找的怎么办?

3==.在语句里面要注意 else 后面直接跟语句,要加条件必须else if.
4. 传参的时候,数组下标是被忽略的! int arr[]
写在最后

本来这个应该十分钟就搞定,结果我出现了几个错误,在以下做个简单分析

1.又一次把等号和赋值符号给弄错
果然下一次我一定要把数字写到前面,气死我了,调试了三四次。
2. 循环里面if 多的时候要注意检查{ }
今天因为{} 的原因程序出错了
3. {}太多的时候一定要认真看语句的正确位置 这个错误害我又检查了很长时间

每天进步一点点加油嗷!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言是一种低级语言,可以直接操作计算机硬件。实现二分查找算法的汇编语言代码如下: ``` section .data array db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 array_size equ $ - array section .text global _start _start: mov eax, 0 ; 左边界 mov ebx, array_size ; 右边界 mov ecx, 5 ; 要查找的元素 binary_search: cmp eax, ebx ; 检查左右边界是否交叉 jg not_found ; 如果左边界大于右边界,则未找到 mov edx, eax ; 计算中间位置 add edx, ebx shr edx, 1 mov al, byte [array + edx] ; 获取中间位置的元素 cmp al, cl ; 比较中间位置的元素与要查找的元素 je found ; 如果相等,则找到了 jl move_right ; 如果中间位置的元素小于要查找的元素,则向右移动左边界 jg move_left ; 如果中间位置的元素大于要查找的元素,则向左移动右边界 move_right: inc eax jmp binary_search move_left: dec ebx jmp binary_search found: ; 找到了,可以在这里进行相应的处理 jmp exit not_found: ; 未找到,可以在这里进行相应的处理 exit: ; 程序退出 mov eax, 1 xor ebx, ebx int 0x80 ``` 上述代码使用了一个有序数组进行二分查找。首先,将左边界`eax`设置为0,右边界`ebx`设置为数组的大小。然后,将要查找的元素`ecx`设置为5。接下来,使用循环进行二分查找,直到找到目标元素或者左右边界交叉。在每次循环中,计算中间位置并获取中间位置的元素进行比较。如果中间位置的元素等于要查找的元素,则找到了;如果中间位置的元素小于要查找的元素,则向右移动左边界;如果中间位置的元素大于要查找的元素,则向左移动右边界。最后,根据是否找到目标元素进行相应的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值