1、实验目的
实现几种典型查找算法
2、实验具体要求
利用折半查找算法实现,在数据序列{1,6,8,16,36,66,88,100}中分别查找关键字8和56,找到后输出位序,找不到输出相应提示信息。
3、实验设计思路(编程语言、模块划分及函数功能描述等)
选择C语言作为编程语言。
模块划分及函数功能描述:
折半查找函数 (binary_search):
功能:实现折半查找算法,用于在已排序的数组中查找指定的关键字。
参数:arr[]:已排序的整型数组。left:当前查找范围的左边界。right:当前查找范围的右边界。key:要查找的关键字。返回值:如果找到关键字,返回关键字在数组中的索引;如果未找到,返回 -1。
主函数 (main):
功能:程序的入口,定义数组和关键字,并调用折半查找函数进行查找。
步骤:定义数组 arr 和计算数组长度 n。定义要查找的两个关键字 key1 和 key2。调用 binary_search 函数分别查找关键字 key1 和 key2。根据查找结果输出相应的信息(找到关键字的位置或者未找到的提示信息)。
实验流程:
编码阶段:编写折半查找函数 binary_search,确保实现正确的折半查找算法。编写主函数 main,定义数组和关键字,调用 binary_search 函数进行查找,并根据返回结果输出信息。
4、实验源程序、程序调试结果
源程序:
#include <stdio.h>
// 折半查找函数
int binary_search(int arr[], int left, int right, int key) {
while (left <= right) {
int mid = left + (right - left) / 2;
// 如果找到关键字,返回索引位置
if (arr[mid] == key) {
return mid;
}
// 如果关键字在左半部分,则更新右边界
if (arr[mid] > key) {
right = mid - 1;
}
// 如果关键字在右半部分,则更新左边界
else {
left = mid + 1;
}
}
// 如果未找到关键字,返回 -1
return -1;
}
int main() {
int arr[] = {1, 6, 8, 16, 36, 66, 88, 100};
int n = sizeof(arr) / sizeof(arr[0]);
int key1 = 8;
int key2 = 56;
// 在数组中查找关键字 key1
int index1 = binary_search(arr, 0, n - 1, key1);
if (index1 != -1) {
printf("关键字 %d 在数组中的位置为 %d\n", key1, index1);
} else {
printf("未找到关键字 %d\n", key1);
}
// 在数组中查找关键字 key2
int index2 = binary_search(arr, 0, n - 1, key2);
if (index2 != -1) {
printf("关键字 %d 在数组中的位置为 %d\n", key2, index2);
} else {
printf("未找到关键字 %d\n", key2);
}
return 0;
}
调试结果:
5.程序调试过程中遇到的问题及解决办法
(1)采用递归方法完成程序设计(需要三个指针来完成)。
(2)出现了重复定义的错误,在同一作用域上进行了两次以上的赋值,编译器无法判断。将重复的定义去掉即可。
6、实验收获与体会
通过实验复习了关于折半查找的相关知识,并且对其查找过程在纸上进行了推算,基本掌握折半查找的算法思想,理解到折半查找法适用于不经常变动且查找频繁的有序列表。