線性表查找
在查找表的組織方式中,線性表是最簡單的一種。我們在學習線性表的時候對線性表操作的實現中就涉及到查找操作的實現,只不過當時沒有考慮到效率或者其他的問題,只采用了最簡單的一次循環遍歷進行查找。
順序查找(Sequential Search)
順序查找(Sequential Search)的查找過程為:從表的一端開始,依次將記錄的關鍵字和給定值進行比較,若某個記錄的關鍵字和給定值相等,則查找成功;若在掃描整個表后仍未找到關鍵字和給定值相等的記錄則表示查找失敗。
順序查找方法既適用於線性表的順序存儲結構,也適用於線性表的鏈式存儲結構。
對於順序存儲結構查找成功時可以返回其在順序表中的位置,對於鏈式存儲結構在查找成功時則可以返回該元素的指針,即結點所在地址。
假設有一個學生結構體定義如下:
[C代碼]
typedef struct _student
{
int stu_number; // 學號
char name[20]; // 姓名
char gender[4]; // 性別
// 其他信息略
}STUENDT;
typedef int KEY_TYPE; // 關鍵字類型,此處以學生的學號作為查詢關鍵字
學生學號唯一,因此可以將學號作為主關鍵字來區分學生。
下面以在一個學生信息集合中根據主關鍵字學號來查找某個學生為例,分別從順序存儲結構和鏈式存儲結構介紹順序查找算法的實現。
順序表的定義
順序表查找
從查找表的一端開始依次比較,實現代碼如下:
int seq_search(SSTABLE st, KEY_TYPE key)
{
int i;
for (i = 0; i < st.length; i++)
{
if (st.data[i].stu_number == key)
{
return i + 1; // 下標從0開始,返回的位置從1開始
}
}
return 0; // 返回0表示查找失敗
}
這里使用主關鍵字進行查找,所以結果要么是找到唯一的一個,要么沒有找到,包括后面的查找算法實現均討論使用主關鍵字進行查找。
順序存儲結構的順序查找實現的改進
前面的查找算法在每一次循環時都需要檢測i是否越界,即判斷i是否小於順序表長度,可以改進這個程序來免去這個檢測,具體的操作是:在順序表存儲數據元素時,從數組的下標1開始存儲,下標0的元素空置,然后在實現順序查找時,將下標0的元素賦值為查找給定的值,然后從后向前查找,由於下標0的元素現在也是和給定值相等,所以這次查找必然會找到結果:原順序表中存在主關鍵字與給定值相等的記錄或者在原順序表中沒有查找到結果而與下標0完成比較。
改進后算法實現如下:
int seq_search2(SSTABLE st, KEY_TYPE key)
{
st.data[0].stu_number = key;
int i = st.length;
while (st.data[i].stu_number != key)
{
i--;
}
return i;
}
測試完整源碼:
