🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
在编程语言中,查找算法是指在一个数据集合中查找某个元素是否存在的算法。常见的查找算法包括:
以上算法都有各自适用的场景,开发者需要根据数据集合的特性和需求选择最适合的算法来进行查找。
二分查找算法是一种基于分治策略的搜索算法,也称为二分法。其基本思想是将要查找的数据与中间位置的数据进行比较,如果大于中间位置的数据,则在右半部分继续查找;如果小于中间位置的数据,则在左半部分继续查找;如果等于中间位置的数据,则直接返回。
具体的实现过程如下:
二分查找算法的时间复杂度为O(log n),比线性查找的时间复杂度O(n)要更优秀,适用于有序数据的查找场景。
二分查找算法的时间复杂度为 O(log n)。
这是因为在二分查找的过程中,每次都将待查找区间缩小一半,因此要进行 log n 次查找才能找到目标元素。
具体来说,假设待查找的区间大小为 n,每次查找都将区间大小减半,直到区间大小为 1。则需要进行的查找次数为 log n。
二分查找算法的应用场景包括:
二分查找算法适用于要查找有序数据的场景。
int[] array = { 8, 11, 21, 28, 32, 43, 48, 56, 69, 72, 80, 94 };
Console.WriteLine(BinarySearch(array, 80));
Console.WriteLine(BinarySearch_dg(array, 66, 0, array.Length - 1));
Console.ReadKey();
static int BinarySearch(int[] array, int key)
{
//直接求解
var min = 0;
var max = array.Length - 1;
var mid = 0;
while (min <= max)
{
mid = (min + max) >> 1;
if (array[mid] > key)
{
max = mid - 1;
}
else if (array[mid] < key)
{
min = mid + 1;
}
else if (array[mid] == key)
{
return mid;
}
}
return -1;
}
static int BinarySearch_dg(int[] array, int key, int low, int high)
{
//递归法
if (low > high) return -1;
var mid = (low + high) >> 1;
if (array[mid] > key)
return BinarySearch_dg(array, key, low, mid - 1);
else if (array[mid] < key)
return BinarySearch_dg(array, key, mid + 1, high);
else
return mid;
}
请注意以上递归实现为尾递归:尽量使用尾递归
在最坏的情况下,二分查找需要在最后一次才能查找到目标关键字,假设原问题规模为n,每次折半原问题,设在第k次时问题规模变为1,那么令 2^k=1 ,因为指数和对数互为逆运算,解得 k=log_{2}n ,即二分查找在最坏的情况下的时间复杂度为: O(logn) 。