public class bSearch{ public static int bSearch(int[]a; int x,int low,int high){ int mid; if(low>high) return -1; //查找不成功 mid=(low+high)/2; if(x == a[mid]) return mid; //查找成功 else if(x<a[mid]) return bSearch(a,x,low,mid-1); //在上半区查找 else return bSearch(a,x,mid+1,high);//在下半区查找 } public static void main(String[]args){ int [] a={1,3,4,5,17,18,31,33}; int x=17; int bn; bn = bSearch(a,x,0,7); if(bn==-1) System.out.println("x不在数组a中"); else System.out.println("x在数组a中,下标为:"+bn); } }
时间: 2023-05-28 20:02:07 浏览: 94
该代码实现了一个二分查找算法,可以查找给定数组a中是否存在指定元素x,并返回其索引值。
具体实现思路是将数组a分成两半,将中间位置mid作为比较对象,如果x与a[mid]相等,则查找成功,返回mid的值;如果x小于a[mid],则在数组的上半区查找,递归调用bSearch(a, x, low, mid-1);如果x大于a[mid],则在数组的下半区查找,递归调用bSearch(a, x, mid+1, high)。
该算法时间复杂度为O(log n),具有较好的效率。
相关问题
帮我看看这段代码:#include <iostream> using namespace std; int bsearch(int a[], int n, int value) { int low = 0; int high = n - 1; while (low <= high) { int mid = low + ((high - low) >> 1); if (a[mid] >= value) { if ((mid == 0) || (a[mid - 1] < value)) return mid; else high = mid - 1; } else { low = mid + 1; } } return -1; } int main() { //ios::sync_with_stdio(false); int n,q; cin>>n>>q; int m[100010]; for(int i=1;i<=n;i++){ cin>>m[i]; } int k[100010]; for(int i=1;i<=q;i++){ cin>>k[i]; } for(int i=1;i<=q;i++){ int ans=bsearch(m,n+1,k[i]); cout<<ans<<' '; } return 0; } // 101 // 110---100 // 111---100 //1000---0000 //1001---0000
这段代码是一个二分查找算法的实现,用于在一个有序数组中查找指定的值。代码中的主要函数是`bsearch`,它接受一个有序数组`a[]`、数组长度`n`和要查找的值`value`作为参数,并返回值在数组中的索引。
在`bsearch`函数中,使用两个指针`low`和`high`来表示要搜索的范围。通过循环,不断缩小搜索范围,直到找到目标值或搜索范围为空。在每次循环中,计算中间索引`mid`,并将该索引处的值与目标值进行比较。如果目标值小于等于中间值,则将`high`指针更新为`mid - 1`;如果目标值大于中间值,则将`low`指针更新为`mid + 1`。如果找到目标值,则检查该值是否为数组中的第一个出现位置,如果是,则返回索引;否则,将`high`指针更新为`mid - 1`。如果循环结束后仍未找到目标值,则返回-1。
在主函数`main()`中,首先读取输入的数组长度和查询次数。然后分别读取数组元素和查询元素,并调用`bsearch`函数进行查找,并将结果输出。
需要注意的是,代码中还有一些注释,用于说明二分查找算法的原理。这些注释并不会影响代码的执行。
如果你有具体的问题或需要进一步的解释,请随时提问。
已有一个10个元素的整形数组a,且按值从小到大有序。输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出"Not Found"。。 要求编写函数int Bsearch(int *p, int n, int x),找到返回下标,找不到返回-1。 函数接口定义: int Bsearch(int *p, int n, int x); 其中 p是数组首地址,n是数组元素个数,x是要查找的值。找到返回下标,找不到返回-1。
可以使用二分查找算法实现这个功能,以下是函数的代码实现:
```c
int Bsearch(int *p, int n, int x) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (p[mid] == x) {
return mid; // 找到返回下标
} else if (p[mid] < x) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 找不到返回-1
}
```
这个函数的实现中,使用 left 和 right 表示查找范围的左右边界,mid 表示中间位置。每次将要查找的区间缩小一半,直到找到或者无法找到为止。
具体来说,每次将中间位置的值与要查找的值比较,如果相等就返回中间位置的下标,如果中间位置的值小于要查找的值,就在右半部分继续查找,否则就在左半部分继续查找。
如果整个过程中没有找到要查找的值,就返回 -1 表示未找到。
使用示例:
```c
#include <stdio.h>
int Bsearch(int *p, int n, int x);
int main() {
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int x = 7;
int index = Bsearch(a, 10, x);
if (index >= 0) {
printf("找到了,下标是 %d\n", index);
} else {
printf("Not Found\n");
}
return 0;
}
int Bsearch(int *p, int n, int x) {
// ...
}
```
输出结果:
```
找到了,下标是 6
```
阅读全文