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

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

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;
}

上面就是三种基本的查找方法,不知道大家能不能明白?!
完整的代码在我的上一篇博文中(顺序表的各种查找方式的实现)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值