1.顺序表的查找,代码如下:
#define MaxSize 100
typedef struct{
int key;
}DataType;
typedef struct{
DataType list[MaxSize];
int length;
}SSTable;
//顺序表的查找算法如下
int SeqSearch(SSTable S, DataType x)
{
int i = S.length;
S.list[0] = x.key;//设置了监视哨
while(S.list[i].key != x.key)
i--;
return i;
}
这里设置了监视哨,主要作用就是防止数组越界,也就是说,让关键字与数组的最后一个元素进行匹配,依次与前一个元素进行匹配,最后总能匹配的到,如果匹配的最后结果 i 等于0。说明,匹配失败,没有查找到元素。
2.有序顺序表的查找
有两种方法:1.顺序查找 2.折半查找
这里主要记录折半查找,又称二分查找,这种查找要求待查找的元素序列必须是从小到大的有序排列。
中心思想:折半查找,将待查找的元素与表中间的元素进行比较,如果两者之间相等,说明查找成功,否则利用中间的位置将表分成两部分;如果待查找元素小于中间位置的元素值,则继续与前一个字表的中间位置进行比较,否则与后一个子表的中间位置元素进行比较;不断重复以上动作。知道找到与待查找元素相等的元素,表明查找成功;如果子表变成空表,说明查找失败。
代码如下:
int BinarySearch(SSTable S, DataType x)
{
int low,high,mid;
low = 0;
high = S.lenth -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)//如果中间元素小于关键字,修改low指针
low = mid + 1;
else if(S.list[mid].key > x.key)//如果中间的元素大于关键字,修改high指针
high = mid -1;
}
return 0;
}
结论就是:如果表中有N个元素,折半查找成功时,至多需要比较的次数为(log以2为底n的对数+1)。【log 2/ n】其中向下取整。