第十三周项目1(2)

[cpp]  view plain  copy
  1. /*  
  2. 烟台大学计算机学院  
  3.   
  4. 文件名称:xiangmu.cpp  
  5.   
  6. 作者:张帅
  7.   
  8. 完成日期:2017年11月26日  
  9.   
  10. 问题描述:验证分块查找算法。 
  11. 请用22,4,23,11,20,2,15,13,30,45,26,34,29,35,26,36,55,98,56,  
  12. 74,61,90,80,96,127,158,116,114,128,113,115,102,184,211,243,188, 
  13. 187,218,195,210,279,307,492,452,408,361,421,399,856,523,704,703,697,535,534,739 
  14. (共n=56个数据,每块数据个数s=8)作为数据表,自行构造索引表,分别对查找61、739、200进行测试。   
  15.   
  16. 输入描述:无 
  17.   
  18. 输出描述:输出查找位置和结果 
  19.   
  20. */   
  21.   
  22.   
  23.   
  24.   
  25. #include <stdio.h>  
  26. #define MAXL 100    //数据表的最大长度  
  27. #define MAXI 50     //索引表的最大长度  
  28. typedef int KeyType;  
  29. typedef char InfoType[10];  
  30. typedef struct  
  31. {  
  32.     KeyType key;                //KeyType为关键字的数据类型  
  33.     InfoType data;              //其他数据  
  34. } NodeType;  
  35. typedef NodeType SeqList[MAXL]; //顺序表类型  
  36.   
  37. typedef struct  
  38. {  
  39.     KeyType key;            //KeyType为关键字的类型  
  40.     int link;               //指向对应块的起始下标  
  41. } IdxType;  
  42. typedef IdxType IDX[MAXI];  //索引表类型  
  43.   
  44. int IdxSearch(IDX I,int m,SeqList R,int n,KeyType k)  
  45. {  
  46.     int low=0,high=m-1,mid,i;  
  47.     int b=n/m;              //b为每块的记录个数  
  48.     while (low<=high)       //在索引表中进行二分查找,找到的位置存放在low中  
  49.     {  
  50.         mid=(low+high)/2;  
  51.         if (I[mid].key>=k)  
  52.             high=mid-1;  
  53.         else  
  54.             low=mid+1;  
  55.     }  
  56.     //应在索引表的high+1块中,再在线性表中进行顺序查找  
  57.     i=I[high+1].link;  
  58.     while (i<=I[high+1].link+b-1 && R[i].key!=k) i++;  
  59.     if (i<=I[high+1].link+b-1)  
  60.         return i+1;  
  61.     else  
  62.         return 0;  
  63. }  
  64.   
  65. int main()  
  66. {  
  67.     int i,n=56,m=7,j;  
  68.     int j1;  
  69.     int j2;  
  70.     SeqList R;  
  71.     IDX I= {{23,0},{45,8},{98,16},{158,24},{243,32},{492,40},{856,48}};  
  72.     KeyType a[]= {22,4,23,11,20,2,15,13,30,45,26,34,29,35,26,36,55,98,56,74,  
  73.                   61,90,80,96,127,158,116,114,128,113,115,102,184,211,243,188,  
  74.                   187,218,195,210,279,307,492,452,408,361,421,399,856,523,704,  
  75.                   703,697,535,534,739};  
  76.     KeyType x=61;  
  77.     KeyType y=739;  
  78.     KeyType z=200;  
  79.     for (i=0; i<n; i++)  
  80.         R[i].key=a[i];  
  81.     j=IdxSearch(I,m,R,n,x);  
  82.     if (j!=0)  
  83.         printf("%d是第%d个数据\n",x,j);  
  84.     else  
  85.         printf("未找到%d\n",x);  
  86.   
  87.     j1=IdxSearch(I,m,R,n,y);  
  88.     if (j1!=0)  
  89.         printf("%d是第%d个数据\n",y,j1);  
  90.     else  
  91.         printf("未找到%d\n",y);  
  92.   
  93.     j2=IdxSearch(I,m,R,n,z);  
  94.     if (j2!=0)  
  95.         printf("%d是第%d个数据\n",z,j2);  
  96.     else  
  97.         printf("未找到%d\n",z);  
  98.     return 0;  
  99. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值