版權聲明:本文源自簡書tianma,轉載請務必注明出處:http://www.lxweimin.com/p/f6ec95118574
定義
順序查找又稱為線性查找,其算法思路是從數組中的第一個(或最后一個)記錄開始,將數組中元素逐個與需要查找的關鍵字進行比對,若發現有相等的,則查找成功;若始終未能相等,則查找失敗。
Java實現
// 定義接口
interface Searcher {
/**
* 從數組array中查找關鍵字key,如果存在則返回該關鍵字在數組中任意出現的位置(不局限于首次或者末次之類的),否則返回-1
*/
int search(int[] array, int key);
}
/**
* 順序表查找,時間復雜度為O(n)
*/
class LinearSearcher implements Searcher {
@Override
public int search(int[] array, int key) {
int len = array.length;
for (int i = 0; i < len; i++) {
if (array[i] == key)
return i;
}
return -1;
}
}
LinearSearcher是標準的線性查找,這里有缺陷:在循環中每個循環實際上需要判斷兩次(一次是否相等,一次是否越界),如何改進呢?其實就是設置“哨兵”:
/**
* 優化的順序表查找,時間復雜度O(n),但是比普通順序表查找效率高
*/
class OptimizedLinearSearcher implements Searcher {
// 相比單純的線性查找每次for循環需要判斷兩次,這里設置關鍵字值(即哨兵),可以讓每次for循環只判斷一次
// 當數據量比較大時,如果單純從線性查找角度看,優化后的線性搜索優勢明顯
@Override
public int search(int[] array, int key) {
int len = array.length;
if (len == 0) // array為空,返回-1
return -1;
if (array[0] == key)
return 0;
array[0] = key; // array[0]不是key,那么將key賦值給array[0],將array[0]作為哨兵
// 這里"哨兵"也可以放在數組尾部
int i = len - 1;
while (array[i] != key) { // 每次循環少判斷一個
i--;
}
if (i == 0) // 從數組尾部一直查找到array[0]才找到,說明不存在
return -1;
return i;
}
}
不論是線性查找還是改進后的線性查找,其時間復雜度都為O(n)