Phương thức Array.BinarySearch(Array, Object) trong C# được dùng để tìm kiếm một phần tử cụ thể trong toàn bộ mảng một chiều đã được sắp xếp, sử dụng giao diện IComparable được triển khai bởi từng phần tử của mảng và đối tượng được chỉ định.
Cú pháp
public static int BinarySearch(Array array, object value);
array: Mảng một chiều đã sắp xếp.value: Đối tượng cần tìm kiếm.
Trả về: Chỉ mục từ 0 của phần tử nếu tìm thấy; ngược lại trả về số âm (bitwise complement của chỉ mục chèn).
Ví dụ 1: Tìm kiếm trong mảng số nguyên
using System;
public class Demo
{
public static void Main()
{
int[] intArr = { 5, 10, 15, 20 };
// BinarySearch BẮT BUỘC mảng đã sắp xếp
Array.Sort(intArr);
Console.WriteLine("Các phần tử mảng...");
foreach (int i in intArr)
{
Console.WriteLine(i);
}
Console.Write("Chỉ mục của 20 = " + Array.BinarySearch(intArr, 20));
}
}
Kết quả
Các phần tử mảng... 5 10 15 20 Chỉ mục của 20 = 3
Ví dụ 2: Tìm kiếm trong mảng chuỗi
using System;
public class Demo
{
public static void Main()
{
string[] strArr = { "John", "Tim", "Fedric", "Gary", "Harry", "Damien" };
Array.Sort(strArr);
Console.WriteLine("Các phần tử mảng...");
foreach (string s in strArr)
{
Console.WriteLine(s);
}
Console.Write("Chỉ mục của 'Gary' = " + Array.BinarySearch(strArr, "Gary"));
Console.Write("\nChỉ mục của 'Tom' = " + Array.BinarySearch(strArr, "Tom"));
}
}
Kết quả
Các phần tử mảng... Damien Fedric Gary Harry John Tim Chỉ mục của 'Gary' = 2 Chỉ mục của 'Tom' = -7
Giải thích kết quả âm
Khi phần tử không tìm thấy, BinarySearch trả về phép bổ sung bitwise (bitwise complement) của chỉ mục chèn:
- Kết quả -7 nghĩa là:
~(-7) = 6→ phần tử nên được chèn tại chỉ mục 6 (cuối mảng). - Công thức:
index = ~returnValuehoặcindex = -returnValue - 1.
Các nạp chồng quan trọng
| Phương thức | Mô tả |
|---|---|
| BinarySearch<T>(T[], T) | Generic, an toàn kiểu, dùng IComparable<T> |
| BinarySearch(Array, Object, IComparer) | Cho phép chỉ định comparer tùy chỉnh |
| BinarySearch(Array, Int32, Int32, Object) | Tìm trong phạm vi con của mảng |
| BinarySearch<T>(T[], T, IComparer<T>) | Generic với comparer tùy chỉnh |
Lưu ý quan trọng
- Mảng PHẢI được sắp xếp trước (Array.Sort) theo thứ tự tăng dần.
- Các phần tử phải triển khai
IComparable(các kiểu cơ bản: int, string, double... đã làm). - Nếu mảng chứa phần tử trùng lặp, kết quả trả về là chỉ mục của một trong các phần tử khớp (không đảm bảo là cái đầu hoặc cuối).
- Hiệu suất O(log n) so với O(n) của tìm kiếm tuyến tính.