前面介紹了幾種資料的排序方式,那今天來講如何搜尋所需要的資料吧。
找資料最簡單的方法,就是一筆一筆資料慢慢找,直到找到要的那筆資料。
那就先介紹最直覺的循序搜尋吧。
說明 :
從陣列第1個元素搜尋到最後一個元素,找到要搜尋的值(target)就會回傳在array裡的index,
如果target不在array裡面,就回傳-1。
使用對象 : 未排序的數列、Linked List
時間複雜度 : O(n),Best case : O(1)。
程式範例 :
public static int SequentialSearch(int ary[], int target)
{
// 遍歷要搜尋的陣列元素
for (int index = 0; index < ary.length; i++) {
// 若值 = 目標數值
if (ary[index] == target) {
// 回傳target所在的鍵值
return index;
}
}
// 目標數值 不存在於 陣列 中
return -1;
}
接著,我們介紹二元搜尋法。
在有序數列
中,選取中間的元素 (middle) 和目標數值(target)比較,會有三種狀況:
如果是 狀況2和狀況3,就在新範圍重選一個中間值與target比較,直到搜尋到target值。
public static int BinarySearch(int ary[], int target)
{
// 搜尋範圍左邊界的鍵值
int left = 0;
// 搜尋範圍右邊界的鍵值
int right = ary.length - 1;
// 搜尋範圍中間的鍵值
int middle;
while (left <= right)
{
// 取得陣列中間的鍵值
middle = (left + right) / 2;
// 狀況1. 目標數值 = 陣列中間值
if (target == ary[middle]) {
return middle;
}
// 狀況2. 目標數值 存在於陣列的右半邊
if (target > ary[middle]) {
// 更新 left 的邊界值
left = middle + 1;
} else {
// 狀況3. 目標數值 存在於陣列的左半邊
// 更新 right 的邊界值
right = middle - 1;
}
}
// 目標數值 不存在於 陣列 中
return -1;
}