分数 10
全屏浏览题目
切换布局
作者 王跃萍
单位 东北石油大学
用二分法在一个有序数列{1,2,3,4,5,6,7,8,9,10}中查找key值,若找到key则输出其在数组中对应的下标,否则输出not found。
输入格式:
直接输入一个要查找的正整数key。没有其它任何附加字符。
输出格式:
找到则在一行中按照“weizhi:下标”的格式输出其在数组中对应的下标,否则输出not found。
输入样例:
4
输出样例:
weizhi:3
输入样例:
15
输出样例:
not found
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
我的答案:
分析过程:
二分查找法是一种在有序数列中查找特定元素的搜索算法。工作原理如下:
- 开始时,选择数组的中间元素。
- 如果该元素是我们正在搜索的元素,则查找过程结束。
- 如果所选元素比目标元素小,则在数列的右半部分中查找。
- 如果所选元素大,则在数列的左半部分中查找。
- 重复该过程,每次减少一半的数据,直到找到匹配的元素或搜索范围为空。
解题步骤:
- 初始化三个指针:low, high和mid。其中low指向数组的开始,high指向数组的末尾。
- 当low <= high时,进行以下步骤:
- 计算mid = (low + high) / 2。
- 检查数组中的中间元素
arr[mid]
。 - 如果
arr[mid]
与key相等,输出mid并结束程序。 - 如果
arr[mid]
< key,将low设置为mid + 1。 - 如果
arr[mid]
> key,将high设置为mid - 1。
- 如果low > high,表示key不存在于数组中,输出"not found"。
C语言:
#include <stdio.h>
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int key, low = 0, high = 9, mid;
scanf("%d", &key);
while (low <= high) {
mid = (low + high) / 2;
if (arr[mid] == key) {
printf("weizhi:%d\n", mid);
return 0;
} else if (arr[mid] < key) {
low = mid + 1;
} else {
high = mid - 1;
}
}
printf("not found\n");
return 0;
}
C++:
#include <iostream>
using namespace std;
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int key, low = 0, high = 9, mid;
cin >> key;
while (low <= high) {
mid = (low + high) / 2;
if (arr[mid] == key) {
cout << "weizhi:" << mid << endl;
return 0;
} else if (arr[mid] < key) {
low = mid + 1;
} else {
high = mid - 1;
}
}
cout << "not found" << endl;
return 0;
}
这两个解决方案都是基于上述的解题步骤。这种查找方法对于大型数据集特别高效,因为它每次迭代都会减少查找范围的一半。
总结:
从这道题目,我们可以学习和深化以下几个方面的认识和技能:
1. **二分查找法的基本原理和应用**:二分查找法是一个经典的搜索算法,用于快速查找有序数列中的特定元素。
2. **算法效率**:理解为什么二分查找是高效的(与线性查找相比),特别是对于大数据集。这种算法的时间复杂性是O(log n),与每次都减少查找范围一半的策略直接相关。
3. **条件循环**:通过while循环和条件判断,我们可以控制程序的执行流程,直到满足某个条件为止。这在很多算法和问题解决方案中都是一个常见的模式。
4. **数组操作**:学习如何在C和C++中使用数组,如何访问和比较其元素。
5. **边界处理**:注意在二分查找中如何正确地调整low, high和mid的值以避免错误和无限循环。
6. **逻辑判断**:如何使用if-else结构进行条件判断和决策,这是编程中的一个基本技能。
7. **输出格式和要求的匹配**:根据题目要求格式化输出结果,体现了实际编程任务中对细节的关注和精确性。
8. **问题分解能力**:学会如何将一个大问题分解成更小、更容易解决的部分。例如,二分查找的每一步都是将问题规模减半。
9. **调试和错误处理**:如果初始实现未能得到正确的答案,这也为我们提供了一个调试代码和处理潜在错误的机会。
总的来说,这道题目为我们提供了一个理解和实现二分查找的机会,这不仅强化了我们的算法和数据结构知识,而且也提高了解决实际问题、调试和代码实现的能力。