顺序查找、折半查找、引索顺序表查找的实现
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;
}
上面就是三种基本的查找方法,不知道大家能不能明白?!
完整的代码在我的上一篇博文中(顺序表的各种查找方式的实现)
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;
}
上面就是三种基本的查找方法,不知道大家能不能明白?!
完整的代码在我的上一篇博文中(顺序表的各种查找方式的实现)
相关文章推荐
- c++实现顺序查找,折半查找
- Java实现三种常用的查找算法(顺序查查找,折半查找,二叉排序树查找)
- 十.用C语言实现查找算法 (1)顺序查找;(2)二分查找(折半查找);(3)二叉排序树;(4)哈希查找
- JavaScript实现折半查找(二分查找)
- C语言查找算法之顺序查找、二分查找(折半查找)
- 查找(一)静态查找的顺序查找和 有序折半查找
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现) .
- C语言顺序表的插入、删除、查找操作实现
- 顺序查找和折半查找
- C语言实现顺序表和有序表的查找以及有序表的递归查找
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- C语言实现顺序表的插入、删除、查找、遍历等基本操作
- 折半查找(二分查找)Java实现
- (基础十)折半查找的实现(二分查找)
- 静态查找(顺序查找,折半查找,插值查找,斐波那契查找)
- Java 语言实现折半查找(二分查找)
- java实现顺序表的增加,删除,查找,打印
- 【C语言】静态顺序表的实现(包括头插、头删、尾插、尾删、查找、删除指定位置)
- 909422229__三种查找算法:顺序查找,二分法查找(折半查找),分块查找
- 折半查找和顺序查找