进阶:二分查找的函数实现
关于二分查找的基础请见我之前的博客。 今天呢,我就和大家一起聊聊二分查找的函数实现。 随着我们水平的提升,我们越来越多的使用函数,使用函数不仅可以使我们的代码变得简洁,还可以使程序使程序流程结构化。 其实呢,函数实现二分查找呢,只需要将二分查找的核心部分拿出来包装为一个独立的函数即可。我们平时写代码的时候呢,函数部分尽可能写的功能单一,这里所说的单一是只函数部分只需要完成它所需要完成的任务即可,方便我们的调用。
主函数部分
-
首先定义一个有序数组 定义要查找的数(当然也可以稍作修改让用户输入) 求出数组长度(数组大小除以数组中一个元素的大小) 调用函数 根据返回值判断
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); if(ret == -1) { printf("找不到 "); } else { printf("找到了, 下标是:%d ", ret); } system("pause"); return 0; }
-
二分查找函数部分
切记:中点一定要定义在循环内部,因为每次判断后要根据判断结果来对左或右边界进行修改以确定新的中点,来进行下一次判断
int binary_search(int arr[], int k, int sz) //将数组 要查找的数 数组大小传入 { int left = 0; //左右下标均在函数内定义 int right = sz-1; while(left<=right) { int mid = left+(right-left)/2; //定义中点 !!! if(arr[mid] < k) 用中点下标对应的元素与k比较 { left = mid+1; } else if(arr[mid] > k) { right = mid-1; } else { return mid; } } return -1; }
完整代码
#include <stdio.h> #include <stdlib.h> int binary_search(int arr[], int k, int sz) //将数组 要查找的数 数组大小传入 { int left = 0; //左右下标均在函数内定义 int right = sz-1; //字符串以 结束,减去一位。 while(left<=right) { int mid = left+(right-left)/2; //定义中点 if(arr[mid] < k) 用中点下标对应的元素与k比较 { left = mid+1; } else if(arr[mid] > k) { right = mid-1; } else { return mid; } } return -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); if(ret == -1) { printf("找不到 "); } else { printf("找到了, 下标是:%d ", ret); } system("pause"); return 0; }