数据结构题目: 几种典型查找算法的实现

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、实验收获与体会

通过实验复习了关于折半查找的相关知识,并且对其查找过程在纸上进行了推算,基本掌握折半查找的算法思想,理解到折半查找法适用于不经常变动且查找频繁的有序列表。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值