二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用于不經常變動而查找頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個子表,如果中間位置記錄的關鍵字大于查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。
開始我們的代碼:
using UnityEngine;
/// <summary>
/// 二分查找算法(在有序數組中快速尋找一個指定數值)
/// </summary>
public class BinarySearchSort : MonoBehaviour
{
//有序數組
int[] array = new[] {5, 6, 7, 8, 9, 12, 45, 55};
void Start()
{
//調用查找方法,輸出 bool值
Debug.Log(BinarySearch(array, 45));
}
/// <summary>
/// 二分查找方法
/// </summary>
/// <param name="array">數組</param>
/// <param name="targetNum">目標數值</param>
/// <returns>是否找到目標數值</returns>
bool BinarySearch(int[] array, int targetNum)
{
//起始點
int start = 0;
//結束點
int end = array.Length - 1;
//中界點
int mid;
//循環遍歷(起始點<=終止點)
while (start <= end)
{
//計算中界點
mid = (start + end)/2;
//第一種情況
if (array[mid] > targetNum)
{
//終止點=中界點-1
end = mid - 1;
}
//第二種情況
else if (array[mid] < targetNum)
{
//起始點=中界點+1
start = mid + 1;
}
//找到
else
{
Debug.Log("所在下標:" + mid);
return true;
}
}
//未找到
Debug.Log("不存在該數值!");
return false;
}
}