1、二分搜索问题 ⑴、设:a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最小元素位置j。当搜索元素在数组中时,I和j相同,均为x在数组中的位置。 ⑵、设:有n个不同的整数排好序后存放于t[0:n-1]中,若存在一个下标I,0≤i<n,使得t[i]=i,设计一个有效的算法找到这个下标。要求算法在最坏的情况下的计算时间为O(logn)。 ⑶、用I,j做参数,且采用传递引用或指针的形式带回值。
时间: 2023-06-01 17:08:12 浏览: 126
回答:"1、二分搜索问题"属于技术问题,我可以回答。
⑴、改写后的算法如下:
```
int binarySearch(int[] a, int x, int[] result) {
int low = 0;
int high = a.length - 1;
int i = -1, j = -1;
while (low <= high) {
int mid = (low + high) / 2;
if (a[mid] == x) {
i = mid;
j = mid;
break;
} else if (a[mid] < x) {
i = mid;
low = mid + 1;
} else {
j = mid;
high = mid - 1;
}
}
result[0] = i;
result[1] = j;
return i;
}
```
调用该函数时传入一个长度为2的整型数组,用于存放小于x的最大元素位置和大于x的最小元素位置。返回值为小于x的最大元素位置。
⑵、设计的算法如下:
因为数组t是已排好序的,因此可以采用二分搜索的方式查找。二分搜索要求每次将搜索范围缩小一半,因此可以考虑将数组中的下标和值相减,如果存在t[i]=i,则t[i]-i=0。假设现在搜索范围为[low, high],在每次判断中都将搜索区间缩小一半。如果t[mid]-mid>0,则应在左侧搜索;如果t[mid]-mid<0,则应在右侧搜索;如果t[mid]-mid=0,则找到了所要查找的下标。
实现的代码如下:
```
int findIndex(int[] t) {
int low = 0;
int high = t.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (t[mid] - mid > 0) {
high = mid - 1;
} else if (t[mid] - mid < 0) {
low = mid + 1;
} else {
return mid;
}
}
return -1;
}
```
该算法的最坏时间复杂度为O(logn)。
⑶、可以定义如下的函数签名:
```
void binarySearch(int[] a, int x, int& i, int& j);
int findIndex(int[] t);
```
其中第一个函数传入数组a、搜索元素x和两个引用参数i、j,返回值为搜索到的位置。第二个函数传入数组t,返回值为满足条件的下标,如果不存在则返回-1。
阅读全文