利用二分法在一个有n(n≤20)个元素的有序数列中查找指定值y。找到y后,先输出查找次数,再输出其在数组中对应的下标。若数列中存在多个y,将所有y的位置按下标序号顺序输出;\n否则输出“not foun
时间: 2023-04-27 10:02:01 浏览: 149
采用二分查找法和顺序查找法查找元素的下标
d”。
二分法是一种高效的查找算法,可以在有序数列中快速定位指定值。具体实现步骤如下:
1. 定义左右指针left和right,分别指向数列的起始和结束位置。
2. 计算中间位置mid,即mid=(left+right)/2。
3. 比较中间位置的值与指定值y的大小关系:
a. 如果mid位置的值等于y,则找到了目标值,输出查找次数(即循环次数),并输出其在数组中对应的下标。
b. 如果mid位置的值大于y,则说明目标值在左半部分,将right指针移动到mid-1位置。
c. 如果mid位置的值小于y,则说明目标值在右半部分,将left指针移动到mid+1位置。
4. 重复步骤2-3,直到left>right为止。
如果数列中存在多个y,可以在找到第一个y后,继续向左和向右查找,直到找到所有的y为止。输出时按下标序号顺序输出。
如果数列中不存在y,则输出“not found”。
代码实现如下:
```
#include <iostream>
using namespace std;
int main() {
int n, y;
cin >> n >> y;
int a[n];
for (int i = ; i < n; i++) {
cin >> a[i];
}
int left = , right = n - 1, cnt = ;
bool found = false;
while (left <= right) {
int mid = (left + right) / 2;
cnt++;
if (a[mid] == y) {
found = true;
cout << cnt << endl;
int i = mid;
while (i >= && a[i] == y) {
cout << i << " ";
i--;
}
i = mid + 1;
while (i < n && a[i] == y) {
cout << i << " ";
i++;
}
cout << endl;
break;
} else if (a[mid] > y) {
right = mid - 1;
} else {
left = mid + 1;
}
}
if (!found) {
cout << "not found" << endl;
}
return ;
}
```
阅读全文