酷代码 AI
菜单
服务商
DeepSeek字节豆包讯飞星火
更多选项

C++实现图书馆书籍二分查找程序及开发建议

以下是一个使用 C++ 实现的二分查找程序,用于解决小明在图书馆查找书籍位置的问题: ```cpp #include <iostream> #include <vector> // 二分查找函数 int binarySearch(const std::vector<int>& arr, int target) { int left = 0, right = arr.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid + 1; // 因为题目要求输出第几本书,所以索引要加 1 } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return arr.size() + 1; // 找不到时返回 n + 1 } int main() { int n, m; std::cin >> n >> m; std::vector<int> books(n); for (int i = 0; i < n; ++i) { std::cin >> books[i]; } for (int i = 0; i < m; ++i) { int target; std::cin >> target; std::cout << binarySearch(books, target) << std::endl; } return 0; } ``` ### 代码解释 1. **二分查找函数 `binarySearch`**: - 该函数接受一个有序的整数向量 `arr` 和目标值 `target` 作为参数。 - 使用两个指针 `left` 和 `right` 分别指向数组的起始和结束位置。 - 在 `left <= right` 的条件下,计算中间位置 `mid`。 - 如果 `arr[mid]` 等于 `target`,则返回 `mid + 1`,因为题目要求输出第几本书。 - 如果 `arr[mid]` 小于 `target`,则将 `left` 更新为 `mid + 1`。 - 如果 `arr[mid]` 大于 `target`,则将 `right` 更新为 `mid - 1`。 - 如果循环结束后仍未找到目标值,则返回 `arr.size() + 1`。 2. **主函数 `main`**: - 读取 `n` 和 `m`,分别表示图书馆的书籍数量和查找次数。 - 读取 `n` 本书的编号,并存储在向量 `books` 中。 - 循环 `m` 次,每次读取一个目标编号,并调用 `binarySearch` 函数进行查找,输出结果。 ### 进阶使用指南 - **性能优化**: - 二分查找的时间复杂度为 $O(log n)$,已经是最优的查找算法之一。但可以考虑使用更高效的内存管理,如使用 `std::array` 代替 `std::vector`,以减少动态内存分配的开销。 - **错误处理**: - 可以添加输入验证,确保输入的 `n` 和 `m` 为正整数,以及书籍编号是有序的。 - **扩展功能**: - 可以添加功能,如查找目标值的所有出现位置,而不仅仅是第一次出现的位置。 ### 技术栈推荐 - C++ 标准库:提供了丰富的容器和算法,如 `std::vector` 和 `std::binary_search`。 - 官方文档:[C++ 参考手册](https://en.cppreference.com/w/) ### 开发建议 - **边界条件处理**:在编写二分查找时,要特别注意边界条件,如 `left <= right` 的判断,避免出现死循环或越界访问。 - **代码可读性**:使用有意义的变量名和注释,提高代码的可读性和可维护性。 - **测试用例**:编写测试用例,覆盖各种边界情况,确保程序的正确性。 ######[AI写代码神器 | 916点数解答 | 2026-04-26 13:02:45]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]