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的数组元素的大小即可计算出数组长度。

目录
相关文章
|
1天前
|
算法 C语言
KMP算法(C语言实现)
KMP算法(C语言实现)
6 0
|
5天前
|
C语言
C语言——二分查找(在万千之中快速找到你)
C语言——二分查找(在万千之中快速找到你)
4 0
|
6天前
|
算法 C语言 人工智能
|
6天前
|
算法 C语言
【C语言】求最小新整数(贪心算法)
【C语言】求最小新整数(贪心算法)
10 1
|
6天前
|
算法 C语言
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-2
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
6天前
|
算法 编译器 API
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-1
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
6天前
|
存储 缓存 算法
【C 言专栏】C 语言实现算法的高效性
【5月更文挑战第6天】本文探讨了C语言在实现高效算法上的优势,包括其高效性、灵活性、可移植性和底层访问能力。关键点包括选择合适的数据结构(如数组、链表、树和图)、应用优化策略(如减少计算、空间换时间、分治和动态规划),以及内存管理和代码优化技巧。通过实际案例(如排序和图遍历算法),阐述了如何利用C语言实现算法高效性,并强调在实践中不断探索和优化以提升算法效率。C语言在计算机科学中的重要地位使其成为实现高效算法的首选工具。
【C 言专栏】C 语言实现算法的高效性
|
6天前
|
搜索推荐 C语言
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
11 0
|
6天前
|
机器学习/深度学习 算法 C语言
【C言专栏】递归算法在 C 语言中的应用
【4月更文挑战第30天】本文介绍了递归算法在C语言中的应用,包括基本概念(通过调用自身解决子问题)、特点(调用自身、终止条件、栈空间)和实现步骤(定义递归函数、分解问题、设置终止条件、组合解)。文中通过阶乘计算和斐波那契数列两个案例展示了递归的使用,强调了递归可能导致的栈溢出问题及优化需求。学习递归有助于理解和应用“分而治之”策略。
|
6天前
|
算法 C语言
【C语言必刷题】3.二分查找
【C语言必刷题】3.二分查找