查找(search):給定結點的關鍵字值 x ,查找值等於 x 的結點的存儲地址。
按關鍵字 x 查:
① 成功,表中有 x ,返回 x 的存儲地址;
② 不成功,x 不在表中,返回無效地址。
順序查找就是以表的一端為起點,向另一個端點逐個元素查看,
可以是從 表頭 → 表尾的順序,也可以是從 表尾 → 表頭的順序
順序查找方法,既適用於無序表,又適用於有序表。
順序查找屬於 “窮盡式搜索法”:通常以 查找長度,度量查找算法的時間復雜性。
查找長度:即查找過程中測試的節點數目。
順序查找的查找長度 = for 循環體的執行次數,最小為1,最多為n。
等概率下:平均查找長度 = (n + 1)/ 2
最壞情況和平均情況:T(n)= O(n) 效率最低的查找算法
我們觀察一下上圖那兩個 for循環體,不難發現,每次執行都需要 判斷兩個條件:
① 測試是否循環到頭;
② 測試是否找到元素 x。
因此我們不妨使用 “監督元” 技術,不僅簡化了程序結構,也提高了查找速度。
若從 表尾 → 表頭 的順序查找,監督元則在表頭處,稱為 “表頭監督元”,如下圖:
若從 表頭 → 表尾 的順序查找,監督元則在表頭處,稱為 “表尾監督元”,如下圖:
帶表頭監督元的順序查找算法:
int SQsearch(int a[],int x,int n){ // SQsearch 是函數名,僅此。
int i;
i = n;
a[0] = x;
while(a[i] != x)
i -- ;
return i;
}
算法思想:
① i = n;// 設置查找起點
② a[0] = x;// 放置監督元,因為在進入循環體之前,已經預先在 a[0] 放置了一個元素 x,所以 x 無論是否真的在表中,總能找到 x ,使第三句的循環中止。注意!!!a[1] 到 a[n] 存儲的才是真正的表元素。
如果 x 真存在表中,必然在某個 i 大於 0 時找到 x,循環終止。
如果循環變量 i 的值變到 0 時循環才終止,那就說明 x 不在表中。
③ while(a[i] != x)
i --; // 從右向左查。
④ return i;// 判定查找結果。查找結果由變量 i 的值判定,
x 在表中,i ≠ 0
x 不在表中,i = 0
只犧牲一個存儲單元,就能將查找效率提升一倍。這在表長 n 較大,查找頻繁的情況下是很合算的,“空間換時間”。雖然查找速度提高一倍,但時間復雜性的階不變,仍是O(n),只是時間復雜性函數的常系數變小了。