6-3 查找3公里测试成绩(二分查找进阶)为了提高学员的军事体能成绩,学员队进行了3公里测试,并按成绩的高低将学员的测试成绩录入并存储。请你实现一个函数,采用二分查找法查找给定成绩出现的位置及查找次数。(假
时间: 2024-10-10 13:09:31 浏览: 30
6-3 二分查找3公里测试成绩是一个实际应用中的二分查找算法问题。二分查找是一种在有序数组中查找特定元素的高效搜索算法,它的基本思想是每次比较中间元素与目标值,然后根据比较结果决定是在数组的左半部分还是右半部分继续查找。对于你的需求,可以按照以下步骤设计函数:
1. 首先,需要有一个已排序的成绩列表(升序),表示每个学员的成绩。
2. 定义一个二分查找函数,输入是要查找的目标成绩和成绩列表。
3. 函数内部设置两个指针,`left`表示查找范围的起始位置,`right`表示结束位置(初始时`left = 0`,`right = len(scores) - 1`)。
4. 当`left <= right`时,进行循环:
a. 计算中间索引 `mid = (left + right) // 2`。
b. 比较目标成绩和中间成绩,如果相等,返回当前索引`mid`作为成绩位置,并记录查找次数(通常是1次,因为找到了);如果目标成绩小于中间成绩,说明成绩在左半边,更新`right = mid - 1`;如果大于,说明在右半边,更新`left = mid + 1`。
5. 如果没找到成绩,返回`-1`表示未找到,同时计算已经进行了多少次比较(查找次数为`right - left + 1`加1,因为在最后一次比较时不需要再缩小范围)。
下面是一个简单的Python实现示例:
```python
def binary_search_scores(target_score, sorted_scores):
left, right = 0, len(sorted_scores) - 1
compare_count = 0
while left <= right:
mid = (left + right) // 2
if sorted_scores[mid] == target_score:
return mid, compare_count + 1
elif sorted_scores[mid] < target_score:
left = mid + 1
else:
right = mid - 1
compare_count += 1
return -1, compare_count
# 示例用法
scores = [2.5, 3.0, 3.5, 4.0, 4.5]
target = 3.0
position, search_times = binary_search_scores(target, scores)
print(f"成绩 {target} 的位置是 {position},查找了 {search_times} 次.")
```
阅读全文