嵌入式学习-02_数据结构和算法 (二分查找)
1.1二分查找
1.1.1 算法原理
二分查找(Binary Search)是一种高效的搜索算法,通常用于有序数据集中查找目标元素。其原理是通过将数据集划分为两半并与目标进行比较,以确定目标在哪一半中,从而逐步缩小搜索范围,直到找到目标元素或确定不存在。基本原理如下:
(1)选择中间元素: 在有序数据集中,选择数组的中间元素。
(2)比较目标: 将中间元素与目标元素进行比较。
(3)查找成功: 如果中间元素等于目标元素,则查找成功,返回中间元素的索引。
(4)缩小搜索范围: 对于一个升序的数据集,如果中间元素大于目标元素,说明目标可能在左半部分;如果中间元素小于目标元素,说明目标可能在右半部分。根据比较结果,将搜索范围缩小到一半,继续查找。
(5)重复步骤: 重复上述步骤,不断将搜索范围缩小,直到找到目标元素或搜索范围为空。
1.1.1 代码实现
#include <stdio.h>
/***********************************************************
* 二分查找
***********************************************************/
/**
* @brief 查找元素所在的位置
* @param int *arr 数组
* @param int len 数组长度
* @param int target 要查找的元素
* @return int 元素的位置,如果没有找到返回-1
*/
int binarySearch(int *arr, int len, int target)
{
//计算首尾元素下标
int start = 0;
int end = len - 1;
//启动循环
while (start <= end)
{
//计算中间元素下标(首元素下标 + 尾元素下标)
int mid = (start + end) / 2;
//目标元素与中间元素相等
if (target == arr[mid])
{
return mid;
}
//目标元素比中间元素小
else if (target < arr[mid] )
{
end = mid - 1;
}
//目标元素比中间元素大
else if (target > arr[mid])
{
start = mid + 1;
}
}
return -1;
}
int main()
{
int nums[] = {1, 3, 4, 6, 7, 8, 9};
printf("4的位置为:%d", binarySearch(nums,7,4));
return 0;
}