C语言-折半查找(二分查找)算法详解

简介: C语言-折半查找(二分查找)算法详解

题目:用折半查找在一个有序数组中查找一个具体的数字n

为了方便讲解,我们假设这里的有序数组是arr[ ] = {1,2,3,4,5,6,7,8,9,10},要查找的数是 7

第一步,我们标出这个有序数组的下标,并找出最左边、最右边和中间的下标:

由图可见,下标left = 0,mid = 4,right = 9。

第二步,将下标为 mid 的数字与要查找的数字 7 进行比较:

  此时因为 arr[mid] = 5 < 7,所以令 left = mid +1 = 5,right = 9不变,此时 mid = (5 + 9)/2 =7。这就缩小了一半的查找范围。

第三步,继续将要下标为 mid 的数与要查找的数字 7 进行比较:

 此时因为 arr[mid] = 8 > 7,所以令 left = 5不变,right = mid - 1 = 6,此时mid = (5 + 6 )/2 = 5。再次缩小一半的查找范围。

第四步,继续将要下标为 mid 的数与要查找的数字 7 进行比较:

  此时因为 arr[mid] = 6 < 7,所以令 left = right + 1 = 6,right = 6 不变,此时mid = (6 + 6)/2 = 6,

mid = left = right,下次再查找就可以找到了。

 这就是折半查找法的具体查找步骤,其中比较元素大小的部分,分为arr[mid] < 7,arr[mid] > 7,和arr[mid] = 7这三种情况,我们可以用 if else 分支语句实现,多次查找while 循环语句实现,将它们嵌套在一起就可以实现在一个有序数组中查找一个具体的数。

下面附上代码:

#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  //假设数组是{1,2,3,4,5,6,7,8,9,10}
  int n = 7;//要查找的数
  int m = sizeof(arr) / sizeof(arr[0]);//计算数组长度
  int right = m - 1;//右边下标
  int left = 0;//左边下标
  while (left <= right)
  {
    int mid = (left + right) / 2;//中间元素的下标
    if (arr[mid] < n)
    {
      left = mid + 1;
    }
    else if (arr[mid] > n)
    {
      right = mid - 1;
    }
    else
    {
      printf("找到了,下标是%d\n", mid);
      break;
    }
    if (left > right)
    {
      printf("找不到了\n");
    }
  }
  return 0;
}

 代码中int m = sizeof(arr) / sizeof(arr[0]);用来计算数组长度,sizeof(arr)是整个数组的大小,sizeof(arr[0])是下标为0的数组元素的大小,用整个数组大小除以下标为0的数组元素的大小即可计算出数组长度。

目录
相关文章
|
2月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
87 1
|
8天前
|
算法 C# 索引
C#二分查找算法
C#二分查找算法
|
10天前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
11天前
|
消息中间件 存储 算法
一文搞懂二分查找算法!
一文搞懂二分查找算法!
|
11天前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
13 0
|
19天前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
2月前
|
机器学习/深度学习 存储 并行计算
C语言与机器学习:K-近邻算法实现
C语言与机器学习:K-近邻算法实现
50 0
|
4月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
90 7
|
5月前
|
搜索推荐 C语言 C++
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
|
10天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
25 3