×

C语言 C语言学习随笔 初始C语言 二分查找 折半查找

C语言学习随笔:一个有序数组内查找某个数字(二分查找算法)

一哥 一哥 发表于2022-10-15 23:40:31 浏览1457 评论0

抢沙发发表评论

程序要求:

1、创建一个整型数组,数组内包含数字1-10

2、输入一个数字,查找输入的数字在数组内的下标并输出结果到屏幕

3、找到或未找到,均需在屏幕上输出查询结果


程序代码:

//方法一:使用for循环实现

//头文件
#include <stdio.h>

//主函数
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; 
    int search_num = 0;  //查询的数字
    int max = (sizeof(arr) / sizeof(arr[0])) - 1;  //最大查询下标位置
    int i = 0;
    printf("请输入您要查询的数字:>");
    scanf("%d", &search_num);
  for (i = 0; i <= max; i++)
  {
    if (search_num == arr[i])
    {
      printf("恭喜,找到了!您查询的数字%d在数组内的下标为:%d\n", search_num, i);
      break;
    }
  }
  if (search_num != arr[i])
  {
    printf("抱歉,数组内没有您查询的数字!\n");
  }
  return 0;
}
//方法二:主函数内使用二分查找实现

//头文件
#include <stdio.h>

//主函数
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int search_num = 0;
  int left_index = 0;  //数组左下标
  int right_index = (sizeof(arr) / sizeof(arr[0])) - 1;  //数组右下标
  int mid = 0;  //中间值
  printf("请输入您要查询的数字:>");
  scanf("%d", &search_num);
  while (left_index <= right_index)
  {
    mid = (left_index + right_index) / 2;
    if (search_num < arr[mid])
    {
      right_index = mid - 1;
    }
    else if (search_num > arr[mid])
    {
      left_index = mid + 1;
    }
    else
    {
      printf("恭喜,找到了!您查询的数字%d在数组内的下标为:>%d\n", search_num, mid);
      break;
    }
  }
  if (left_index > right_index)
  {
    printf("抱歉!数组内没有您要查询的数字!");
  }
  return 0;
}
//方法三:使用二分查找函数实现

//头文件
#include <stdio.h>

//二分查找函数
int bin_search(int que_arr[], int left, int right, int que_num)  //(查询数组, 左下标, 右下标, 查询数)
{
    int mid = 0;
  while (left <= right)
  {
    mid = (left + right) >> 1;  //二进制右移1位,相当于数学上的除2运算,但相对除2运算速度更快
    if (que_num < que_arr[mid])
    {
      right = mid - 1;
    }
    else if (que_num > que_arr[mid])
    {
      left = mid + 1;
    }
    else
    {
      return mid;  //找到数字,返回下标
    }
  }
  return -1;  //未找到数字,返回-1
}

//主函数
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int search_num = 0;
  int left_index = 0;
  int right_index = (sizeof(arr) / sizeof(arr[0])) - 1;
  int bin_num = 0;  //二分查找变量,调用二分查询函数用
  printf("请输入您要查询的数字:>");
  scanf("%d", &search_num);
  bin_num = bin_search(arr, left_index, right_index, search_num);  //传递参数给二分查找函数
  if (-1 == bin_num)
  {
    printf("抱歉,数组内没有您要查询的数字!\n");
  }
  else
  { 
    printf("恭喜,找到了!您要查询的数字%d在数组内的下标为:>%d\n", search_num, bin_num);
  }
  return 0;
}


程序解析:

1、方法一使用for循环。查找数组时从第1个下标开始查找,当查找的数据较多,且较靠近数组尾部时,运算效率较差。

2、方法二使用二分查找法。每一次查找,都可以去掉一半的数据,运算效率高。

3、方法三创建了一个二分查找函数。当程序内需要多次进行查找时,只需调用函数即可,不需要每次都编写代码。有效提高代码编写速度和效率

少长咸集

群贤毕至

访客