1、顺序搜索
---无序表的顺序搜索:从前往后(从后往前)逐个比较;可以在顺序表上实现,也可以在链表上实现。
for (i=0; i<n; i++)
if(L[i]==x)
return Success; //搜索成功
return NotPresent; //搜索失败
---有序表的顺序搜索:从前往后(从后往前)逐个比较;可以在顺序表上实现,也可以在链表上实现
for (i=0; (i<n)&&(L[i]<x); i++);
if ((i<n)&&(L[i]==x))
return Success; //搜索成功
return NotPresent; //搜索失败
(每次循环都要检测搜索范围是否越界。通过设置哨兵元素可以提高算法效率。)
带哨兵元素的有序表顺序搜索:
L[n]=x; //设置哨兵元素
for (i=0; L[i]<x; i++); //不需要检测是否越界
if ((i<n)&&(L[i]==x))
return Success; //搜索成功
return NotPresent; //搜索失败
2、二分搜索法
只能在顺序存储的有序表上实现。
设有序表长度为n:
(a0,a1,.....,an-1)
将中间位置上的元素am的关键字与待搜索元素x的关键字进行比较:
-若相等,则搜索成功;
-若x较小,则在子表(a0,...,am-1)中继续进行二分搜索
-若x较大,则在子表(am+1,.....,an-1)中继续进行二分搜索
into m,low=0,high=n-1;
while (low<=high){
m=(low+high)/2;
if (x<L[m]) high=m-1;
else if (x>L[m]) low=m+1;
else return Success; //搜索成功
}
return NotPresent; //搜索失败
性能分析:
时间复杂度O(log2N),在所有基于关键字比较的搜索方法中,二分搜索速度最快。二分搜索只能在顺序存储的有序表上实现。