前几天跟大家粗劣的介绍了一下这几种查找方法,现在在下再详细一点点介绍(技术不好,请见谅!)
1,顺序查找
顾名思义就是按顺序一个接着一个去查找啦!
我们可以先建立一个顺序表
#define MAXSIZE 100
typedef struct
{
KeyType key;
}DataType;
typedef struct
{
DataType list[MAXSIZE];
int lenght;
}SSTable;
然后呢,就一个接一个查找,实现方法
int SeqSearch(SSTable S, DataType x)
{///在顺序表中查找关键字,如果找到放回表中所在位置
int i=0;
while( S.list[i].key!=x.key && i<S.lenght )
{
i++;
}
if( S.list[i].key == x.key )
{
return i+1; ///返回所在位置
}
else
{
return -1; ///-1作为一个不存在的标志
}
}
其实这种方法是很容易想到的,只要跟着顺序表一个一个找就是了
2,折半查找
这种方法还是需要一点点技术的,他比上面的方法要快一些。他的原理其实也不难:
在一个有序排列中,比如:9,23,26,32,47
首先先要确定low=9、high=47、mid=26(第一个,最后一个,中间一个)
如果我们查找的是32的话 ,因为32大于mid,所以就在后部分找,这样就可以把时间缩小一半
实现方法为:
int BinarySearch(SSTable S, DataType x)
{
int low , high , mid;
low=0;
high=S.lenght-1;
while(low<=high)
{
mid=(low+high)/2;
if( S.list[mid].key==x.key )
{
return mid+1; ///为什么要加一呢?就是因为下表从零开始
}
else if( S.list[mid].key > x.key )
{
high=mid-1;
}
else if( S.list[mid].key <x.key )
{
low=mid+1;
}
}
3,引索顺序不表查找
引索顺序表的查找就是把顺序表分成几个单元,然后为这几个单元创建引索,利用引索在其中一个单元中进行查找。
我们先创建一个引索表
typedef struct
{
KeyType maxkey;
int index;
}IndexTable[INDEXSIZE];
然后就可以进行查找了,查找的代码如下:
int SeqIndexSearch(SSTable S, IndexTable T , int m, DataType x)
{ /// m表示有多少块
int i, j, bl;
for(i=0; i<m; i++)
{
if( T[i].maxkey >= x.key )
{
break; //找出x在引索表的哪一块
}
}
if( i>= m )
{
return -1;
}
j=T[i].index; //要查找的元素在第j单元
if( i<m-1 )
{
bl = T[i+1].index-T[i].index; //第j个单元的长度
}
else
{
bl=S.lenght-T[i].index; //这是最后一个单元的算法
}
while( j<T[i].index+bl ) //一个一个第比较
{
if( S.list[j].key == x.key )
{
return j+1;
}
else
j++;
}
return -1;
}
上面就是三种基本的查找方法,不知道大家能不能明白?!
完整的代码在我的上一篇博文中(顺序表的各种查找方式的实现)