数组中查找某个特定的数据元素(二分查找)

(1)定义 left和right;left初值0,right初值n-1(n是查找表中数据的个数);

(2)求中间值mid=(left+right)/2,a[mid];

(3)a[mid]与所求值key比;若a[mid]值小于key;因数组为升序所以mid左部元素均小于key;接下来只需在mid右边查找;所以设置left=mid+1 ;若a[mid]值大于key;因数组为升序所以mid右部元素均打于key;接下来只需在mid左边查找;所以设置right=mid-1 ;

(4)重复(2),(3)步骤,如果a[mid]值等于所求值,则查找成功;如果left>right 则表示没有该元素,则查找失败;

算法可优化改进的提示: 若待查找值key小于a[0]且大于a[n-1],则说明key值不可能的数组中,不需要进入二分查找的步骤

#include <iostream>
using namespace std;

int binarySearch(int arr[], int n, int target, int& compareCount) {
    int left = 0;
    int right = n - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;
        compareCount++;

        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return -1;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int n = sizeof(arr) / sizeof(arr[0]);
    int target = 6;
    int compareCount = 0;

    int index = binarySearch(arr, n, target, compareCount);

    if (index != -1) {
        cout << "Element found at index " << index << endl;
    } else {
        cout << "Element not found" << endl;
    }

    cout << "Number of comparisons: " << compareCount << endl;

    return 0;
}
#include <iostream>
using namespace std;
#include <stdio.h>

int find_pos(int data[], int n, int key)
{//在数组data中查找给定数据key,n是数组中数据元素的个数,返回值是数据元素比较的次数.

 /*------------begin-----------------*/
    int mid, left = 0,right = n - 1, times = 0;
    
    if (data[left] > key) return 0;
    if (data[right] < key) return 0;
    while (left <= right) 
    {
        times++;
        mid = (left + right) / 2;

        if (data[mid] == key)
        {
            break;
        }
        else if (data[mid] > key)
        {
            right = mid - 1;
        }
        else 
        {
            left = mid + 1;
        }
    }
    return times;
    /*------------end-----------------*/
}

int main(void)
{
    int a[] = { -1,15,66,99,122,189 };
    int x;
    cin >> x;
    //此处填写代码,调用find_pos,在a数组中查找给定数据x的位置,并输出函数返回值
      /*------------begin-----------------*/
    int size = sizeof(a) / sizeof(a[0]);
    cout << find_pos(a, size, x);
    /*------------end-----------------*/

    return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二分查找是一种高效的查找算法,其基本思想是将有序数组分成两半,然后通过比较中间和目标的大小,来确定下一步要查找的区间。每次查找都可以将待查找区间缩小为原来的一半,因此时间复杂度为O(logn)。 下面是一个用二分法在数组中查找某个特定数据元素,并返回比较次数的C语言代码: ```c #include <stdio.h> // 二分查找函数 int binary_search(int arr[], int n, int target, int* count) { int left = 0, right = n - 1; while(left <= right) { int mid = (left + right) / 2; (*count)++; // 每次比较都增加计数器 if(arr[mid] == target) { return mid; // 找到目标,返回下标 } else if(arr[mid] > target) { right = mid - 1; // 目标在左半部分 } else { left = mid + 1; // 目标在右半部分 } } return -1; // 没有找到目标,返回-1 } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int n = sizeof(arr) / sizeof(arr[0]); int target = 6; int count = 0; int result = binary_search(arr, n, target, &count); if(result != -1) { printf("目标 %d 在数组中的下标为 %d,比较次数为 %d\n", target, result, count); } else { printf("目标 %d 没有在数组中找到,比较次数为 %d\n", target, count); } return 0; } ``` 在上面的代码中,`binary_search`函数接受一个整型数组、数组长度、目标和计数器指针作为参数,返回目标数组中的下标,如果没有找到,则返回-1。在函数中,我们通过迭代算法实现二分查找,并在每次比较时增加计数器。在`main`函数中,我们定义了一个整型数组`arr`、数组长度`n`和目标`target`,然后调用`binary_search`函数进行查找,最后输出查找结果和比较次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值