折半查找算法(BinarySearch)

这篇具有很好参考价值的文章主要介绍了折半查找算法(BinarySearch)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

折半查找算法(BinarySearch)

1、BinarySearch算法的描述

        查找算法是一种在数字列表中确定目标元素所在位置的算法。假设给定一个目标元素 11 和一个包含元素 11 的数字列表(例如 10, 11, 12,13,14, 15, 16, 17, 18, 19, 20),然后在该数字列表中找到目标元素的位置。

        折半查找算法也叫做对分查找和二分查找。折半查找算法适合用于有序的数字列表,无序的数字列表适合顺序查找(SequentialSearch)。折半查找算法逻辑是从一个数字列表的中间元素开始查找,这将能够判别出目标元素在列表的前半部分还是在列表的后半部分;如果在前半部分,就不需要查找后半部分;如果在后半部分,就不需要查找前半部分。这将使得算法的性能更好和效率更高。

        重复这个过程直到找到目标元素或者确定目标元素不在这个数字列表中。如果找到该目标元素,则输出目标元素的位置;如果没有找到,则返回-1。当然,返回值可以随意设定,不一定是-1,其目的是为了更好的人机交互。

2、用图示描述BinarySearch算法

折半查找法,数据结构与算法,算法,c语言​ 注:图想法源于机械工业出版社出版的《计算机科学导论》(P163),作者是【美】贝赫鲁兹-佛罗赞  

         上图给出了如何在 11 个元素的数字列表中找到目标元素 11,其中定义了 3 个数组下标变量left、right 和 mid 。图中银灰色区域是在折半查找过程中被忽略的那一半元素。下面描述折半查找算法的详细步骤。

(1)开始时,left 为 1,right 为10。计算中间位置 mid (( left +right)/2), (0 + 10)/2 = 5, 即中间位置为5,其元素为 15 。现在比较目标元素 11 和在中间位置元素 15 , 11 < 15 ,所以忽略后半部分,即 15(包含 15)以后的所有元素。

(2)将 right 移到 mid 前面,即位置 4。计算第二个一半的中间位置 mid,(0 + 4)/ 2 = 2,即中间位置为 2,其元素为 12。现在比较目标元素 11 和在中间位置元素 12 ,11 < 12 ,所以忽略12(包含12)以后的元素。

(3)将 right 移到 mid 前面,即位置 1。计算第三个一半的中间位置 mid,如上图所示,只剩余两个元素,没有中间位置,但是根据程序可以计算出其“相对中间位置”,mid 计算的结果指向哪个位置,那个位置就是“相对中间位置”。(0 + 1)/ 2 = 0,因为数组下标是整形,所以计算结果是0,即中间位置为 0,其元素为 10。现在比较目标元素 11 和在中间位置元素 10, 11 > 10 , 所以忽略10(包含 10)以前的元素。

(4)因为 11 > 10 , 所以将 left 移到 mid 后面,即位置 1。按照程序计算第四个一半的中间位置 mid ,(1 + 1)/ 2 = 1 ; 即中间位置为 1 ,其元素为 12 。现在比较目标元素 11 和在中间位置元素 11,11 = 11 , 即找到目标元素,此时算法结束。

        折半查找算法要设计成:找到目标元素或者目标元素不在算法中停止。从这个算法中可以看出:当目标元素不在列表中时,left 的值大于right 的值,即数组左下标大于数组右下标,这在数组中是完全不可能的,所以这反常的条件就是结束算法的终止条件。

3、用代码描述BinarySearch算法

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

//查找的目标元素
#define X 15

//函数声明
int BinarySearch(int* arr, int sz, int x);

int main()
{
	//将需要查找目标元素的数字列表存入数组
	int arr[] = { 10,11,12,13,14,15,16,17,18,19,20 };

	//求数组元素的个数
	int sz = sizeof(arr) / sizeof(arr[0]);

	//定义查找的目标元素
	int x = X;

	//数组、数组元素个数和目标元素
	int position = BinarySearch(arr, sz, x);

	//输出目标元素的位置
	if (position != -1)
	{
		printf("目标元素在第 %d 个位置", position);
	}
	else
	{
		printf("没有找到");
	}

	return 0;
}	

int BinarySearch(int* arr, int sz, int x)
{
	//左下标
	int left = 0;

	//右下标
	int right = sz;

	while (left <= right)
	{
		//中间元素下标
		int mid = (left + right) / 2;

		if (x > arr[mid])
		{
			left = mid + 1;
		}
		else if (x < arr[mid])
		{
			right = mid - 1;
		}
		else
		{
			return mid + 1;
		}
	}

	//没有找到
	return -1;
}

关键代码解释:

        return    mid + 1;

        因为数组下标是从 0 开始的,下标比真正的元素位置错位 1,所以在找到目标元素后,将其数组下标加 1 就是该目标元素真正的位置。

4、总结

         这篇文章写了BinarySearch算法的文字描述、图示描述和代码描述。在这里为了方便实现此算法,只输入了 11 个没有重复且有序的正整数。算法一般情况下具有通用性,所以这个BinarySearch 算法可以查找 n 个整数。各位看官,也可以拷贝代码试试输入更多的整数(正整数,0和负整数),看看这个算法能不能对目标元素准确查找。

         各位看官,也可以根据此算法,自己写一写查找具有重复数字的逻辑代码。有啥好的想法我们可以评论区互相交流呀,今天的分享总结就到这里了,我们下期再见  !!!文章来源地址https://www.toymoban.com/news/detail-768909.html

到了这里,关于折半查找算法(BinarySearch)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言折半查找算法及代码实现

    1.折半查找的定义: 在计算机中, 折半查找 ,也称 二分搜索。它 是一种在有序数组中查找某一特定元素的搜索算法。 2.折半查找的实现原理:                  搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素

    2024年02月05日
    浏览(45)
  • Java数据结构与算法:查找算法之二分查找

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,欢迎回到本专栏。在这个冰冷的季节里,我们将一同探讨Java中一种高效的查找算法——二分查找。让我们点燃知识的火花,一同解锁这个查找奇迹的秘密! 二分查找简介 二分查找,也称为折半查找,

    2024年01月21日
    浏览(36)
  • 数据结构算法--1 顺序查找二分查找

    顺序查找时间复杂度为O(n) 我们可以借助Python中的函数enumerate,通过enumerate遍历列表返回其索引和值 也可以通过列表长度依次遍历: 但是二分查找时间复杂度为O(logn):

    2024年02月12日
    浏览(41)
  • 数据结构--》掌握数据结构中的查找算法

            当你需要从大量数据中查找某个元素时,查找算法就变得非常重要。         无论你是初学者还是进阶者,本文将为你提供简单易懂、实用可行的知识点,帮助你更好地掌握查找在数据结构和算法中的重要性,进而提升算法解题的能力。接下来让我们开启数据

    2024年02月08日
    浏览(44)
  • 【数据结构(七)】查找算法

    在 java 中,我们常用的查找有四种:     ① 顺序(线性)查找     ② 二分查找/折半查找     ③ 插值查找     ④ 斐波那契查找 问题:     数组arr[] = {1, 9, 11, -1, 34, 89},使用线性查找方式,找出11所在的位置。 代码实现: 运行结果: 问题:     请

    2024年02月04日
    浏览(35)
  • 【算法】二分查找——BinarySearch

    二分查找又称折半查找,是一种能够大幅减少时间复杂度的查找方法,但是二分查找要求线性表必须词用顺序储存结构,而且表中元素按有序排列。 在后续讨论中,我们假设有序表递增有序。 二分查找中使用的术语: 目标 Target —— 你要查找的值 索引 Index —— 你要

    2024年03月14日
    浏览(25)
  • 数据结构--6.3查找算法(静态、动态)(插值查找)

    静态查找:数据集合稳定,不需要添加,删除元素的查找操作。 动态查找:数据集合在查找的过程中需要同时添加或删除元素的查找操作。 对于静态查找来说,我们不妨可以用线性表结构组织数据,这样可以使用顺序查找算法,如果我们在对进行排序,则可以使用折

    2024年02月09日
    浏览(31)
  • 数据结构与算法:树形查找

    左子树结点值 根结点值 右子树结点值 对二叉排序树进行中序遍历,可以得到一个递增的有序数列 原理: 对于一个给定的二叉排序树,如果要查找一个节点,可以按照以下步骤进行: 从根节点开始比较。 如果要查找的值等于当前节点的值,则找到了目标节点,返回该节点。

    2024年02月06日
    浏览(31)
  • 数据结构 ----- 折半插入排序

    ​​​​ ​ 折半插入排序 ​ 活动地址:CSDN21天学习挑战赛 一、折半插入排序 1.1 概念 折半插入排序 (Binary Insertion Sort)是对插入排序算法的一种改进。所谓插入排序,就是不断的依次将元素插入前面已排好序的序列中。 1.2 查找过程 折半插入排序的基本思想跟直接插入排

    2024年02月09日
    浏览(25)
  • 数据结构——折半插入排序

    目录 ​一、算法介绍 1.算法思想 2.算法流程 二、算法实现 1.代码实现 2.测试用例及结果 三、性能分析 1.时间复杂度 2.空间复杂度 折半插入排序的思想是借用了折半查找的思路,通过在已经有序的序列(默认序列第一个元素为有序序列)中利用二分查找快速定位插入位置,这

    2024年02月12日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包