您的位置:首页 > 其它

顺序查找、折半查找、引索顺序表查找的实现

2011-11-22 19:23 246 查看
前几天跟大家粗劣的介绍了一下这几种查找方法,现在在下再详细一点点介绍(技术不好,请见谅!)

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;

}

上面就是三种基本的查找方法,不知道大家能不能明白?!

完整的代码在我的上一篇博文中(顺序表的各种查找方式的实现)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: