二分查找案例一直过不了,哪出了问题?

原题:在一个长度为N且已升序排列、不包含重复元素的数组中,寻找一个目标值(target),并返回目标值在数组中的下标。如果目标值不存在于数组中,返回它将会被按升序插入的位置的下标。

 

#include<iostream>
using namespace std;
int erfenchazhao(int* a, int n,int target) {
	int left = 0, right = n - 1;
	while (left <= right) {
		int mid = (right+left) / 2;
		
		if (a[mid] > target) {
			right = mid-1;
		}
		else if (a[mid] < target) {
			left = mid+1;
		}
		else if (a[mid] == target) {
			return mid;
		}
	}
	return -2;
}
int ifnotinarr(int* a, int n, int target) {
	int m=0;
	if (target > a[n - 1]) {
		m = n;
	}
	else {
		for (int i = 0; i < n; i++) {
			if (a[i] > target) {
				m = i;
				break;
			}
		}
	}
	return m;
}
int main() {
	int n,target;
	cin >> n;
	if (n == 0) cout << 0;
	else {
		int* a = new int[n];
		for (int i = 0; i < n; i++) {
			cin >> *(a + i);
		}
		cin >> target;
		if (erfenchazhao(a, n, target) > -2) {
			cout << erfenchazhao(a, n, target);
		}
		
		else if (erfenchazhao(a, n, target) == -2) {
			cout << ifnotinarr(a, n, target);
		}
	}
	return 0;
}

纯萌新,想不通,求大佬解答

感觉你这个有点复杂,完整案例

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    /*
        折半查找(二分法)
        前提条件:
            1.必须确保数组有效
        a[10]={1,2,3,4,5,6,7,8,9,10};
        5
        left=0
        right=9
        mid=(left+right)/2=4;
        4
        left=0,right=3,mid=(0+3)/2=1
        left=2,right=3,mid=(2+3)/2=2;
        left=3,right=3,mid=(3+3)/2=3;
        1
        left=0,right=9,mid=(left+right)/2=4;
        left=0,right=3,mid=(0+3)/2=1
        left=0,right=2,mid=(0+2)/2=1
        left=0,righ=1,mid=(0+1)/2=0
    */
    int a[10]={1,2,3,4,5,8,10,110,120,1000};
    int left,right,mid;
    int num,cnt=0;
    printf("请输入你要查找的数据:");
    scanf("%d",&num);
    left = 0;
    right= 9;
    while(left<=right){
        //计算查找次数
        cnt++;
        //获取中间位置元素的下标
        mid = (left+right)/2;
        if(num>a[mid]){
            //往右找
            left=mid+1;
        }else if(num<a[mid]){
            //往左找
            right=mid-1;
        }else{
            //找到了
            printf("在第%d个位置找到了数据,共查找%d次\n",mid+1,cnt);
            break;
        }
    };
    if(left>right){
        printf("你要查找的数据不存在\n");    
    }
}

C语言各种算法详解:https://edu.csdn.net/course/detail/2766

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632