二分法查找。设已有一个10个元素的整形数组a,且按值从小到大有序排列。输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。

二分法查找。设已有一个10个元素的整形数组a,且按值从小到大有序排列。输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。

参考如下:

#include <stdio.h>

int serach(int a[], int len, int n)
{

    int low=1, high= len;
    while(low<=high)
    {
        int mid=(low+high)/2;
        if(n==a[mid])
            return mid;
        else if(n < a[mid])
            high=mid-1;
        else 
            low=mid+1;
    }
    return -1;
}

int main(void)
{
    int a[10]={1,2,3,4,5,6,7,8,9,10}, n; 
    printf("请输入您要查找的数: ");
    scanf("%d",&n);
    int len = sizeof(a) / sizeof(a[0]);
    int result = serach(a, len, n);
    if (result!=-1) 
        //printf("%d是数组a中的第%d个元素",n, result + 1);
        printf("下标:%d", result);
    else
        printf("Not Found");
    return 0;
}
  • 建议你看下这篇博客👉 :编程实现二分查找:设已有一个10个元素的整形数组a,且按值从小到大有序。输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出"Not Found"。
  • 以下回答由chatgpt基于相关博客总结生成:

    ```markdown 解题思路: 由于数组已经排好序,因此可以采用二分查找的方法来查找元素x。具体实现分为以下几个步骤: 1. 定义变量left和right,分别表示数组范围的左右端点,初始时left为0,right为数组长度减1。 2. 判断left和right是否相遇,如果相遇则表示数组中没有元素x,输出"Not Found"提示,结束查找过程。 3. 对于left和right不相遇的情况,找到数组中间的元素mid,与x比较大小。如果mid等于x,则表示查找成功,输出mid的值,结束查找过程。 4. 如果mid小于x,则说明元素x只可能出现在mid右侧的部分,因此更新left为mid+1。 5. 如果mid大于x,则说明元素x只可能出现在mid左侧的部分,因此更新right为mid-1。 6. 回到第2步,继续查找。

    代码如下:```

    include

    int main() { int n, x, i, left, right, mid; int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 示例数组,可以根据题目要求进行修改 scanf("%d %d", &n, &x); // 输入n和x for (i = 0; i < n; i++) { scanf("%d", &a[i]); // 输入数组元素 } left = 0; right = n - 1; while (left <= right) { // 当left和right不重叠时,继续查找 mid = (left + right) / 2; // 找到中间位置mid if (a[mid] == x) { // 如果mid就是要查找的元素x,输出mid的值并结束查找过程 printf("%d\n", mid); return 0; } else if (a[mid] < x) { // 如果mid小于x,则查找范围应该在mid的右侧部分,更新left为mid+1 left = mid + 1; } else { // 如果mid大于x,则查找范围应该在mid的左侧部分,更新right为mid-1 right = mid - 1; } } printf("Not Found\n"); // 最终未找到x,输出"Not Found"提示 return 0; }