C语言:写一个函数,实现一个整型有序数组的二分查找

简介: 思路:总体思路:(一)自定义函数部分: (1).参数:

思路:

总体思路:

(一)自定义函数部分:

               

(1).

参数:

int arr[] -- 数组首地址


int k -- 要在数组中找的数字


int sz -- 数组长度


           


定义左右下标;


               


(2).


使用二分查找法;


           


(二)主函数部分:


       


定义有序数组,设置要查找的值,求出数组元素个数。


           


调用自定义函数。


           


判断自定义函数的返回值,打印相应的情况。

自定义函数部分:

第一步:

(1). 形参的设置:

int arr[] -- 数组首地址

int k -- 要在数组中找的数字

int sz -- 数组长度

(2). 定义左右下标 -- left right

                   

实现代码:

#include <stdio.h>
int binary_search(int arr[], int k, int sz)//形参
{
  int left = 0; //左下标
  int right = sz - 1; //右下标
}
int main()
{
  return 0;
}


实现图片:


ca47ada73ebc40078bfb31de46ce1772.png

第二步:

使用二分查找方法

       

(1). 使用while循环

         

(2). 生成中间值下标 mid

int mid = left + (right - left) / 2;


left 是 小的一边,(right - left)是两者的差值,(right - left)/ 2 是差值的一半,


left + (right - left) / 2,即 小的一边 加上 差值的一半,


这时 两边是一样的,任意一边都是平均值(中间值)


           


(3).


如果中间值 小于 要找的值,


舍弃中间值和中间值左边的所有数,调整 左下标left :left = mid + 1。


如果中间值 大于 要找的值,


舍弃中间值和中间值右边的所有数,调整 右下标right :right = mid - 1。


如果中间值 等于 要找的值,


返回中间值下标mid。


           


(4). 找不到则返回 -1 。

实现代码:

int binary_search(int arr[], int k, int sz)//形参
{
  int left = 0; //左下标
  int right = sz - 1; //右下标
  //使用while循环
  while (left <= right)
  {
    //生成中间值下标 mid :
    int mid = left + (right - left) / 2;
    //二分查找:
    if (arr[mid] < k)//中间值 小于 要找的值
    {
      left = mid + 1;
      //舍弃中间值和中间值左边的所有数,
      //调整 左下标left :left = mid + 1。
    }
    else if (arr[mid] > k)//中间值 大于 要找的值
    {
      right = mid - 1;
      //舍弃中间值和中间值右边的所有数,
      //调整 右下标right :right = mid - 1。
    }
    else if (arr[mid] == k)//中间值 等于 要找的值
    {
      return mid;
      //返回中间值下标mid。
    }
  } 
  if (left > right)
  {
    return -1; //找不到则返回-1
  }
}

实现图片:


632735d2c9734c3ba3688f5a9ba34059.png

主函数部分:

(1). 定义有序数组,设置要查找的值,求出数组元素个数

             

(2). 调用自定义函数

3). 判断自定义函数返回值打印相应的情况

                   

实现代码:

#include <stdio.h>
int binary_search(int arr[], int k, int sz)//形参
{
  int left = 0; //左下标
  int right = sz - 1; //右下标
  //使用while循环
  while (left <= right)
  {
    //生成中间值下标 mid :
    int mid = left + (right - left) / 2;
    //二分查找:
    if (arr[mid] < k)//中间值 小于 要找的值
    {
      left = mid + 1;
      //舍弃中间值和中间值左边的所有数,
      //调整 左下标left :left = mid + 1。
    }
    else if (arr[mid] > k)//中间值 大于 要找的值
    {
      right = mid - 1;
      //舍弃中间值和中间值右边的所有数,
      //调整 右下标right :right = mid - 1。
    }
    else if (arr[mid] == k)//中间值 等于 要找的值
    {
      return mid;
      //返回中间值下标mid。
    }
  } 
  if (left > right)
  {
    return -1; //找不到则返回-1
  }
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //定义有序数组
  int k = 7; //设置要查找的值
  int sz = sizeof(arr) / sizeof(arr[0]); //求出数组元素个数
  // 整个数组大小 / 单个数组元素大小 = 数组元素个数
  //调用自定义函数:
  int ret = binary_search(arr, k, sz); //ret接收返回的下标
  //判断自定义函数的返回值,打印相应的情况:
  if (ret == -1) //未找到,返回-1
  {
    printf("找不到\n");
  }
  else
  {
    printf("找到了,下标是:%d\n", ret);
  }
  return 0;
}

实现图片:

image.png

最终代码和实现效果

最终代码:

#include <stdio.h>
int binary_search(int arr[], int k, int sz)//形参
{
  int left = 0; //左下标
  int right = sz - 1; //右下标
  //使用while循环
  while (left <= right)
  {
    //生成中间值下标 mid :
    int mid = left + (right - left) / 2;
    //二分查找:
    if (arr[mid] < k)//中间值 小于 要找的值
    {
      left = mid + 1;
      //舍弃中间值和中间值左边的所有数,
      //调整 左下标left :left = mid + 1。
    }
    else if (arr[mid] > k)//中间值 大于 要找的值
    {
      right = mid - 1;
      //舍弃中间值和中间值右边的所有数,
      //调整 右下标right :right = mid - 1。
    }
    else if (arr[mid] == k)//中间值 等于 要找的值
    {
      return mid;
      //返回中间值下标mid。
    }
  } 
  if (left > right)
  {
    return -1; //找不到则返回-1
  }
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //定义有序数组
  int k = 7; //设置要查找的值
  int sz = sizeof(arr) / sizeof(arr[0]); //求出数组元素个数
  // 整个数组大小 / 单个数组元素大小 = 数组元素个数
  //调用自定义函数:
  int ret = binary_search(arr, k, sz); //ret接收返回的下标
  //判断自定义函数的返回值,打印相应的情况:
  if (ret == -1) //未找到,返回-1
  {
    printf("找不到\n");
  }
  else
  {
    printf("找到了,下标是:%d\n", ret);
  }
  return 0;
}

实现效果:

497f92bf06d044298e2f7feeb0614560.png

相关文章
|
1天前
|
编译器 程序员 C语言
【C语言篇】从零带你全面了解函数(包括隐式声明等)(下篇)
⼀般情况下,企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。
|
23小时前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
11 4
|
4天前
|
测试技术 C语言
C语言中的void函数
C语言中的void函数
|
4天前
|
存储 安全 编译器
C语言中的scanf函数
C语言中的scanf函数
|
4天前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
4天前
|
C语言
C语言中的无参函数
C语言中的无参函数
|
23小时前
|
C语言
【C语言】epoll函数
【C语言】epoll函数
8 0
|
1天前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
1天前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
1天前
|
程序员 编译器 Serverless
【C语言篇】从零带你全面了解函数(包括隐式声明等)(上篇)
函数的参数部分需要交代清楚:参数个数,每个参数的类型是什么,形参的名字叫什么。