一. 静态查找表
静态查找表是仅对查找表进行查找操作,而不能改变其中数据的线性表,可以是基于数组的顺序存储或以线性链表存储。静态查找表主要有顺序表、有序顺序表和索引顺序表三种。
1. 顺序查找
函数模型
int seqsearch(element list[], int searchnum, int n)
{
int i;
for (i=0;i < n; i++) //遍历这n个元素
if (list[i].key == searchnum) //若第i个元素的关键字等于searchnum
return i;
//若循环结束了,还没有返回,说明什么?那么如何返回?
if(i == n)
return -1;
}
2.折半查找
2.1非递归折半查找
int binsearch(element list [], int searchnum, int n)
{
int left = 0, right = n-1, middle;
while (!(left == right)){
middle = (left + right)/2; //计算中点下标
if (list[middle].key < searchnum) // 根据下一条语句,你说填什么?
left = middle+1; //这条语句说明查找的关键字在哪个半区?
else if (list[middle].key == searchnum) //什么条件下返回 middle啊?
return middle;
else
right = middle -1; //剩下的你有的选择吗?
}
return -1;
}
2.2递归折半查找
int binsearch2(element list[],int searchnum,int start,int end)
{
int left = start,right = end,middle;
// printf("left = %d,right = %d\n",left,right);
middle = (left + right)/2;
while(!(left == right))
{
if(list[middle].key > searchnum)
return binsearch2(list,searchnum,left,middle - 1);
if(list[middle].key == searchnum)
return middle;
if(list[middle].key < searchnum)
return binsearch2(list,searchnum,middle + 1,right);
}
return -1;
}
3.索引表查找
int indexsequelsearch(indextype ls[] , elemtype s[] , int m, int n ,keytype key)
{
int i , j ,last;
i=0; //找到key所在块的索引
while(i < m && key > ls[i].key)
i++;
// printf("i = %d",i);
if(i == m) //若该索引超过了最大索引值,则表明key大于s中的最大值,查找失败
return -1;
else
{
//key可能在第i块中,找到第i块在s中的起始下标赋值到j
j = ls[i].link;
//last标识搜索的终点
if (i<m-1) last = ls[i+1].link;
else last = n;
//在s中查找key,直到找到key值,或者与全部n个数据均比较完
while(key!=s[j].key && j < last)
j++;
//根据j值判断是否查找到key
if(j < last)
return j ;
else
return -1;
}
}