8集合与静态查找
8.1 静态表的查找
8.1.1无序表
关键是把第0个位置空出来,从最后一位向前查找,返回0则不存在
//建立集合
template <class KEY,class OTHER>
struct SET
{
KEY key;
OTHER other;
};
//建立无序表
template<class KEY,class OTHER>
void seqSearch(SET<KEY,OTHER>data[],KEY x,int size)
{
int i;
data[0].key=x;
for(i=size;data[i].KEY!=x;i--);
return i;
}
8.1.2 有序表的查找
8.1.2.1顺序查找
template<class KEY,class OTHER>
int seqSearch(SET<KEY,OTHER>data[],const&KEY x,int size)
{
int i;
data[0].key=x;
//前一个数比这个数大则比较结束
//不相等则向前推进
for(i=size;data[i].key!=x&&data[i].key>data[i-1].key;i--);
if(x==data[i].key) return i;
else return 0;
}
8.1.2.2 二分查找
易错点是data中第一个元素位置是1
template <class KEY,class OTHER>
int binarySearch(SET<KEY,OTHER>data[],const KEY &x,int size)
{
int low=1;
int high=size;
int mid=(high+low)/2;
while(low<high)
{
if(data[mid].key==x) return mid;
if(data[mid].key<x) high=mid-1;
if(data[mid].key>x) low=mid+1;
mid=(high+low)/2;
}
return 0;
}
8.1.2.3插值查找
适用于已经排好序,分布均匀,可以套公式算出查找的位置
8.1.2.4 分块查找
把有序表分成若干个索引块,索引块内部可以是有序表or无序表,但索引块之间一定有序
索引文件里包含块最大元素和块起始地址,帮助快速定位查找元素大概范围
*总结
针对静态的集合,介绍了查找操作的实现。包括顺序查找、二分查找、插值查找和分块查找。
静态表与动态表的区别是:静态表不支持插入删除操作,只能查找
但动态表不仅可以查找,还有插入删除操作