第十三周 【项目1 - 验证折半查找算法】

  1. /* 程序头部注释开始  
  2. * 程序的版权和版本声明部分  
  3. * Copyright (c) 2017, 烟台大学计算机学院学生  
  4. * All rights reserved.  
  5. * 文件名称:   danlianbao.cpp                            
  6. * 作    者:   胡俊超                            
  7. * 完成日期:   2017 年 11 月 30 日  
  8. * 版 本 号:   v1.0        
  9.    
  10. * 对任务及求解方法的描述部分 

  1. * 问题描述:
  2. 认真阅读并验证折半查找算法。请用有序表{12,18,24,35,47,50,62,83,90,115,134}作为测试序列,分别对查找90、47、100进行测试。 

    1. 折半查找
    2. #include <stdio.h>
      #define MAXL 100
      typedef int KeyType;
      typedef char InfoType[10];
      typedef struct
      {
          KeyType key;                //KeyType为关键字的数据类型
          InfoType data;              //其他数据
      } NodeType;
      typedef NodeType SeqList[MAXL];     //顺序表类型
      
      int BinSearch(SeqList R,int n,KeyType k)
      {
          int low=0,high=n-1,mid;
          while (low<=high)
          {
              mid=(low+high)/2;
              if (R[mid].key==k)      //查找成功返回
                  return mid+1;
              if (R[mid].key>k)       //继续在R[low..mid-1]中查找
                  high=mid-1;
              else
                  low=mid+1;          //继续在R[mid+1..high]中查找
          }
          return 0;
      }
      
      int main()
      {
          int i,n=10;
          int result;
          SeqList R;
          KeyType a[]= {1,3,9,12,32,41,45,62,75,77},x=75;
          for (i=0; i<n; i++)
              R[i].key=a[i];
          result = BinSearch(R,n,x);
          if(result>0)
              printf("序列中第 %d 个是 %d\n",result, x);
          else
              printf("木有找到!\n");
          return 0;
      }


    3. 递归的折半查找算法
    4. #include <stdio.h>
      #define MAXL 100
      typedef int KeyType;
      typedef char InfoType[10];
      typedef struct
      {
          KeyType key;                //KeyType为关键字的数据类型
          InfoType data;              //其他数据
      } NodeType;
      typedef NodeType SeqList[MAXL];     //顺序表类型
      
      int BinSearch1(SeqList R,int low,int high,KeyType k)
      {
          int mid;
          if (low<=high)      //查找区间存在一个及以上元素
          {
              mid=(low+high)/2;  //求中间位置
              if (R[mid].key==k) //查找成功返回其逻辑序号mid+1
                  return mid+1;
              if (R[mid].key>k)  //在R[low..mid-1]中递归查找
                  BinSearch1(R,low,mid-1,k);
              else              //在R[mid+1..high]中递归查找
                  BinSearch1(R,mid+1,high,k);
          }
          else
              return 0;
      }
      
      int main()
      {
          int i,n=10;
          int result;
          SeqList R;
          KeyType a[]= {1,3,9,12,32,41,45,62,75,77},x=75;
          for (i=0; i<n; i++)
              R[i].key=a[i];
          result = BinSearch1(R,0,n-1,x);
          if(result>0)
              printf("序列中第 %d 个是 %d\n",result, x);
          else
              printf("木有找到!\n");
          return 0;
      }


      
      

题目描述: 定义一个整型数组r,用于存储关键码集合,其中r[1]~r[n]用于存储有效的关键码,r[0]留作它用,注意该数组按关键码有序。按照折半查找方法,查找在关键码集合中是否有符合给定值的记录,如果有,返回该记录所在数组下标,如果没有,返回0。要求输出查找过程,即输出每一轮的low,mid,high值,查找过程中需要比较的关键码值都输出。(数组的长度小于<100) -------------------------------------------------------------------------------- 输入样例: 10 2 3 5 6 8 9 11 17 44 58 5 17 4 -------------------------------------------------------------------------------- 输出样例: 1 5 10 8 1 2 4 3 3 3 4 5 3 1 5 10 8 6 8 10 17 8 1 5 10 8 1 2 4 3 3 3 4 5 0 -------------------------------------------------------------------------------- 输入描述: 各个命令以及相关数据的输入格式如下: 第一行输入关键码集合中关键码的数目,假设输入的值为n; 第二行输入n个关键码,以空格隔开,注意是整型; 接下来三行输入三个待查值. -------------------------------------------------------------------------------- 输出描述: 对于每个待查值,先输出查找待查值的比较过程,即输出找到之前每一轮low,mid,high值,以空格隔开,及与待查值相比较的所有的关键码值,每一轮占一行; 接下来如果找到待查值,输出位置下标,如果没找到,输出0.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值