เมธอด Array.BinarySearch(Array, Object) ใน C# ใช้ค้นหา element เฉพาะในอาร์เรย์หนึ่งมิติที่ เรียงลำดับแล้ว โดยใช้ interface IComparable ที่แต่ละ element implement ไว้
⚠ สำคัญ: อาร์เรย์ ต้องเรียงลำดับแล้ว ก่อนเรียกใช้เมธอดนี้ มิฉะนั้นผลลัพธ์จะไม่ถูกต้อง
รูปแบบไวยากรณ์ (Syntax)
public static int BinarySearch(Array arr, object val);
arr: อาร์เรย์หนึ่งมิติที่ เรียงลำดับแล้วval: object ที่ต้องการค้นหา
ค่าที่คืนกลับ
- ดัชนี (index) ที่เป็นเลขบวกหรือศูนย์ : พบค่าที่ค้นหา
- ค่าลบ : ไม่พบค่าที่ค้นหา (ค่าที่คืนคือ bitwise complement ของดัชนีที่ควรจะอยู่)
ตัวอย่างที่ 1: ค้นหาในอาร์เรย์จำนวนเต็ม
using System;
public class Demo
{
public static void Main()
{
int[] intArr = { 5, 10, 15, 20 };
Array.Sort(intArr); // เรียงลำดับก่อน (แม้จะเรียงอยู่แล้วก็ตาม)
Console.WriteLine("Array elements...");
foreach (int i in intArr)
{
Console.WriteLine(i);
}
Console.Write("Element 20 is at index = " + Array.BinarySearch(intArr, 20));
}
}
ผลลัพธ์
Array elements... 5 10 15 20 Element 20 is at index = 3
ตัวอย่างที่ 2: ค้นหาในอาร์เรย์สตริง (พบและไม่พบ)
using System;
public class Demo
{
public static void Main()
{
string[] strArr = { "John", "Tim", "Fedric", "Gary", "Harry", "Damien" };
Array.Sort(strArr);
Console.WriteLine("Array elements...");
foreach (string s in strArr)
{
Console.WriteLine(s);
}
Console.Write("Element Gary is at index = " + Array.BinarySearch(strArr, "Gary"));
Console.Write("\nElement Tom is at index = " + Array.BinarySearch(strArr, "Tom"));
}
}
ผลลัพธ์
Array elements... Damien Fedric Gary Harry John Tim Element Gary is at index = 2 Element Tom is at index = -7
การตีความค่าลบที่คืนกลับ
เมื่อไม่พบค่า ค่าที่คืนจะเป็น ~index (bitwise complement) ของตำแหน่งที่ควรจะอยู่
- ค่า -7 หมายถึง ~(-7) = 6 → ตำแหน่งที่ 6 (ท้ายอาร์เรย์)
- สามารถคำนวณตำแหน่งที่ควร insert ได้ด้วย
~result
สรุป
- เร็วกว่า Linear Search มาก (O(log n) vs O(n))
- ต้องการอาร์เรย์ที่เรียงลำดับแล้วเป็นข้อกำหนดบังคับ
- เหมาะสำหรับอาร์เรย์ขนาดใหญ่ที่ค้นหาบ่อย
- มี overload อื่นๆ รองรับ range, comparer, และ generic types