原题:在一个长度为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