用C语言实现,在一个有序数组中查找具体的某个数字。

折半查找是一种高效的搜索算法,适用于有序数组。它通过比较目标值与数组中间元素来不断缩小搜索范围,时间复杂度为O(logn)。文章提供了两种方法的C语言实现,包括顺序查找和折半查找,并解释了折半查找的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:顺序查找

#include <stdio.h>

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 i = 0;

for(i=0;i<sz;i++)

{

        if(k==arr[i])

        {

        printf("找到了,下标为:%d\n",i);

        break;

    }

    }

 if(i==sz)

 printf("没有找到\n");

return 0;

}

方法二:折半查找

#include <stdio.h>

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 left = 0;//左下标

       int right = sz-1;//右下标

       while(left<=right)//循环判断条件左下标一定要小于等于右下标

{

       int mid = (left+right)/2;//想好为什么mid要放在循环里面,若放在循环外面那么循环内部的mid是恒定不变的

       if(k<arr[mid])

       {

              right = mid-1;

       }

       else if (k>arr[mid])

       {

              left = mid+1;

       }

       else

       {

              printf("找到了,下标为:%d\n",mid);

              break;

       }

}

if(left>right)

{

       printf("没有找到\n");

}

       return 0;

}

什么是折半查找,怎么使用呢?

折半查找(Binary Search),也称为二分查找,是一种高效的搜索算法,用于在有序数组中查找特定元素的位置。

折半查找的基本思想是:
1. 将目标值与数组的中间元素进行比较。
2. 如果目标值等于中间元素,则找到了目标值,结束搜索。
3. 如果目标值小于中间元素,说明目标值在数组的左半部分,将搜索范围缩小为左半部分,并重复步骤1。
4. 如果目标值大于中间元素,说明目标值在数组的右半部分,将搜索范围缩小为右半部分,并重复步骤1。
5. 如果最终搜索范围为空,则表示目标值不在数组中。

以下是一个示例代码,展示如何使用折半查找算法在已排序的数组中查找目标值:


def binary_search(arr, target):
    low = 0
    high = len(arr) - 1

    while low <= high:
        mid = (low + high) // 2
        mid_val = arr[mid]

        if mid_val == target:
            return mid
        elif mid_val < target:
            low = mid + 1
        else:
            high = mid - 1

    return -1  # 目标值不在数组中

# 示例用法
arr = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]
target = 23

result = binary_search(arr, target)
if result != -1:
    print(f"目标值 {target} 的索引为 {result}")
else:
    print(f"目标值 {target} 不在数组中")

以上代码将输出:"目标值 23 的索引为 5",表示目标值23在数组索引为5的位置上。

需要注意的是,折半查找要求数组必须是有序的,否则可能得不到正确的结果。在每次比较后,折半查找将搜索范围减半,因此它的时间复杂度是O(log n),其中n是数组的大小。相比线性搜索,折半查找具有更高的效率。