順序查找法的特點是,用所給關鍵字與線性表中各元素的關鍵字逐個比較,直到成功或失敗。存儲結構通常爲順序結構,也可爲鏈式結構。
順序結構數據類型的定義:
#define LIST_SIZE 20
typedef struct {
KeyType key;
OtherType other_data;
} RecordType;
typedef struct {
RecordType r[LIST_SIZE+1];
int length;
} RecordList;
在表的一端設置一個稱爲“監視哨”的附加單元,存放要查找元素的關鍵字。從表的另一端開始查找,如果在“監視哨”找到要查找元素的關鍵字,返回失敗信息,否則返回相應下標。
int SeqSearch(RecordList l, KeyType k)
{
l.r[0].key = k;
i = l.length;
while (l.r[i].key != k)
i--;
return(i);
}
用平均查找長度(ASL)分析順序查找算法的性能。假設列表長度爲 n,那麼查找第 i個數據元素時需進行 n-i+1 次比較,即 Ci=n-i+1。又假設查找每個數據元素的概率相等,即 Pi=1/n,則順序查找算法的平均查找長度爲:
爲便於比較,下面給出不用“監視哨”的算法
int SeqSearch(RecordList l, KeyType k)
{
i = l.length;
while (i >= 1 && l.r[i].key != k)
i--;
if (i >= 1)
return (i) else return (0);
}
算法 2 與算法 1 相比,循環控制條件中增加了 i>=1,用以判斷查找過程是否越界。加 上“監視哨”可省去這個條件,從而提高查找效率。
折半查找法又稱爲二分查找法,這種方法對待查找的列表有兩個要求:
(1)必須採用順序存儲結構;(2)必須按關鍵字大小有序排列。
首先,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;
否則利用中間位置記錄將表分成前、後兩個子表。
如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。
重複以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。
下圖給出了用折半查找法查找 12、50 的具體過程,其中 mid=(low+high)/2,當 high<low 時,表示不存在這樣的子表空間,查找失敗
int BinSrch (RecordList l, KeyType k)
{
low = 1;
high = l.length;
while (low <= high) {
mid = (low + high) / 2;
if (k == l.r[mid].key)
return(mid);
else if (k < l.r[mid].key)
high = mid - 1;
else
low = mid + 1;
}
return (0);
}
ppt裏 略