C语言经典算法之二分查找详解

简介: C语言经典算法之二分查找详解

目录

1 . 算法思想:
2 . 查找步骤:
3 . 图解
4 . 代码演示:
1 . 算法思想:
二分查找又称折半查找,适合对已经排好序的数据集合进行查找,时间复杂度为O(log2n),效率高。对一升序的数据集合,先找出升序数据集合最中间的元素,将数据划分为两个子集,将最中间的元素和关键字进行比较,如果相等则返回,如果大于关键字,则在前一个数据子集中查找,如果想小于反之,直至找到为止

2 . 查找步骤:
(1) 首先确定查找区间的中间位置(假定是一个升序的数组),那么mid = left + ( right - left ) / 2 ;
//为了防止越界
(2) 用待查找值与中间位置值进行比较,若相等,则找到,输出
(3) 若大于,则在后半区域中继续进行折半查找
(4) 若小于,则在前半区域中继续进行折半查找
(5) 查找成功,则返回数值的数组下标

3 . 图解
假设查找数组int arr[] = {1,2,3,4,5,6,7,8,9,10}中的数值7

分析:一共经历三次查找,四处left=right时查找结束。第一次mid=4,5小于7,则left=mid+1=5,继续在右侧折半查找,第二次mid=7,8大于7,则right=mid-1=6,第三次mid=5,6小于7,left=mid+1=6,此时left=right,找到7,下标为6

4 . 代码演示:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;

while (left<=right)
{
    //int mid = (left + right) / 2;
    int mid = left + (right - left) / 2;//防止数据过大,越界

    if (arr[mid] < k)
    {
        left = mid + 1;
    }
    else if (arr[mid] > k)
    {
        right = mid - 1;
    }
    else
    {
        printf("找到了,下标是:%d\n", mid);
        break;
    }
}
if (left > right)
    printf("找不到\n");

return 0;

}

运行结果:
image.png

相关文章
|
29天前
|
算法
【算法】二分查找——二分查找
【算法】二分查找——二分查找
|
23天前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
45 1
|
29天前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
26天前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
19天前
|
机器学习/深度学习 存储 并行计算
C语言与机器学习:K-近邻算法实现
C语言与机器学习:K-近邻算法实现
27 0
|
2月前
|
算法
【算法】二分查找(整数二分和浮点数二分)
算法学习——二分查找(整数二分和浮点数二分)
28 0
【算法】二分查找(整数二分和浮点数二分)
|
3月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
3月前
|
算法 C语言
C语言----判断n是否是2的次方数,利用到按位与&,算法n&(n-1)
C语言----判断n是否是2的次方数,利用到按位与&,算法n&(n-1)
|
3月前
|
C语言
C语言----数组----二分查找
C语言----数组----二分查找
|
3月前
|
机器学习/深度学习 算法 索引
数据结构算法--1 顺序查找二分查找
**顺序查找时间复杂度为O(n)**,适合无序列表,可以通过`enumerate`或直接遍历索引来实现。**二分查找时间复杂度为O(logn)**,适用于有序列表,利用Python中`left`、`right`指针和`mid`点不断缩小搜索范围。效率上二分查找更优。