判断一个数是否是数组中的成员(用二分法查找)。数组a中有10个已排序的整数(由小到大排列)。从键盘上输入一个数,判断这个数是否是数组a中的数,如果是的话,打印出此数在数组a中的位置,否则打印“找不到”。 【实现提示】 ① 设待查找的数为x,设三个位置变量l、m、h分别代表查找范围的顶部、中间位置和底部,m=(l+h)/2,把数分成以a[m]为中点的两段范围; ② 判断x 是否等于a[m],假设是,则找到; ③ 假设大于a[m],则x必在后半段范围,即在a[m+1]至a[h]。舍弃前半段,再在后半段重新划分两段范围,定出l、m和h,重复以上步骤,逐步缩小查找范围。
时间: 2024-02-12 21:08:22 浏览: 18
好的,这是一个经典的二分查找算法。下面是实现代码:
```python
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 已排序的整数数组
x = int(input("请输入一个数:")) # 从键盘上输入待查找的数
l, h = 0, len(a) - 1 # 初始化查找范围的顶部和底部
while l <= h:
m = (l + h) // 2 # 取中间位置
if x == a[m]: # 如果查找成功
print("找到了,该数在数组中的位置是:", m)
break
elif x < a[m]: # 如果待查找的数小于中间数
h = m - 1 # 舍弃后半段
else: # 如果待查找的数大于中间数
l = m + 1 # 舍弃前半段
else:
print("找不到")
```
这里使用了 `while-else` 结构,当 while 循环正常结束时(即没有被 break 跳出),会执行 else 语句块。在这个例子中,如果找到了待查找的数,会执行 break 跳出循环,不执行 else 语句块;如果没有找到,会执行 else 语句块,打印出“找不到”。
相关问题
编写程序,完成下列功能: (1)输入20个整数到数组中; (2)对20个数按从大到小的顺序排序,输出排序后的数组; (3)输入一个整数x; (4)在数组中,用二分法查找x。如果找到了输出x在数组中的下标,找不到输出-1。
好的,我会帮你实现这个功能。以下是 C++ 代码实现:
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
int binarySearch(int arr[], int n, int x)
{
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == x) {
return mid;
}
else if (arr[mid] > x) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return -1;
}
int main()
{
int arr[20];
cout << "请输入20个整数:" << endl;
for (int i = 0; i < 20; ++i) {
cin >> arr[i];
}
sort(arr, arr + 20, greater<int>());
cout << "排序后的数组为:" << endl;
for (int i = 0; i < 20; ++i) {
cout << arr[i] << " ";
}
cout << endl;
int x;
cout << "请输入一个整数x:" << endl;
cin >> x;
int index = binarySearch(arr, 20, x);
if (index == -1) {
cout << "数组中未找到x!" << endl;
}
else {
cout << "x在数组中的下标为:" << index << endl;
}
return 0;
}
```
程序首先输入20个整数到数组中,然后使用 `std::sort` 函数对数组进行从大到小的排序,输出排序后的数组。接着,程序输入一个整数 x,调用 `binarySearch` 函数进行二分查找,找到了输出 x 在数组中的下标,找不到输出 -1。
编写一个C语言程序,接收一个包含10个整数的乱序数组,然后使用二分法在数组中查找指定元素。如果找到目标元素,返回该元素在排序后数组中的索引;如果没有找到,返回-1。要求使用指针操作数组。
可以参考如下代码实现:
```c
#include <stdio.h>
int binary_search(int *arr, int n, int target);
int main() {
int arr[10] = {4, 8, 2, 6, 1, 9, 3, 7, 5, 0};
int target = 9;
int index = binary_search(arr, 10, target);
if (index == -1) {
printf("Target element not found.\n");
} else {
printf("Target element found at index %d.\n", index);
}
return 0;
}
int binary_search(int *arr, int n, int target) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
```
在上面的代码中,我们首先定义了一个 `binary_search` 函数用于实现二分查找。该函数接收三个参数:一个指向数组首元素的指针、数组的长度和目标元素的值。在函数中,我们使用 `left` 和 `right` 两个变量记录数组的左右两个边界,不断缩小范围来查找目标元素。如果找到了目标元素,返回其在数组中的索引;否则返回 -1。
在 `main` 函数中,我们定义了一个包含10个随机整数的乱序数组,并指定了目标元素为 9。然后调用 `binary_search` 函数来查找目标元素,并输出结果。