给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始
要求使用顺序索引查找算法,其中索引表查找和块内查找都采用不带哨兵、从头开始的顺序查找方法。
给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始
要求使用顺序索引查找算法,其中索引表查找和块内查找都采用不带哨兵、从头开始的顺序查找方法。
第一行输入n,表示主表有n个数据
第二行输入n个数据,都是正整数,用空格隔开
第三行输入k,表示主表划分为k个块,k也是索引表的长度
第四行输入k个数据,表示索引表中每个块的最大值
第五行输入t,表示有t个要查找的数值
第六行起,输入t个数值,输入t行
每行输出一个要查找的数值在队列的位置和查找次数,数据之间用短划线隔开,如果查找不成功,输出字符串error
#include<iostream> using namespace std; void buildindexlist(int *array,int *index,int *indexorder,int n,int k) { int pos=1; indexorder[pos++]=1; for(int i=1;i<=n;i++) { if(array[i]>index[pos-1]) { indexorder[pos++]=i; } } } int cfind(int *array,int *index,int *indexorder,int n,int k) { int times=0;///总查找次数 int pos=0; int pos_i;///索引表所找到的i的位置 for(int i=1;i<=n;i++)///先去索引表找大概位置 { if(array[0]<=index[i]) { pos=indexorder[i]; pos_i=i; times++; break; } else times++; } if(pos==0) return 0; int Up; if(pos_i==k) Up=n; else Up=indexorder[pos_i+1]-1; for(int i=pos;i<=Up;i++) { if(array[0]==array[i]) { times++; cout<<i<<"-"<<times<<endl; return i; } else times++; } return 0; } int main() { int n; cin>>n; int *array=new int[n+1]; for(int i=1;i<=n;i++) cin>>array[i]; int k; cin>>k; int *index=new int[k+1]; for(int i=1;i<=k;i++) cin>>index[i]; int *indexorder=new int[k+1]; index[0]=indexorder[0]=-1; buildindexlist(array,index,indexorder,n,k); int num; cin>>num; while(num--) { cin>>array[0]; int result=cfind(array,index,indexorder,n,k); if(result==0) cout<<"error"<<endl; } delete []array; delete []index; delete []indexorder; return 0; }
原文:https://www.cnblogs.com/SZU-DS-wys/p/12182958.html