อัลกอริทึมการค้นหาแบบไบนารีเป็นวิธีที่มีประสิทธิภาพมากกว่าในการค้นหาองค์ประกอบเฉพาะในรายการที่เรียงลำดับ ซึ่งแตกต่างจากการค้นหาเชิงเส้นซึ่งจะตรวจสอบองค์ประกอบตามลำดับ การค้นหาแบบไบนารีจะแบ่งรายการออกเป็นครึ่งๆ และเปรียบเทียบองค์ประกอบเป้าหมายกับองค์ประกอบตรงกลาง กระบวนการนี้ทำซ้ำจนกว่าจะพบองค์ประกอบเป้าหมายหรือช่วงการค้นหาว่างเปล่า
มันทำงานอย่างไร
- เริ่มต้นด้วยรายการที่เรียงลำดับทั้งหมด
- ค้นหาองค์ประกอบตรงกลางของช่วงการค้นหาปัจจุบัน
- เปรียบเทียบองค์ประกอบตรงกลางกับค่าเป้าหมาย
- หากองค์ประกอบตรงกลางเท่ากับค่าเป้าหมาย การค้นหาจะสำเร็จ
- หากองค์ประกอบตรงกลางมากกว่าเป้าหมาย ให้ค้นหาในครึ่งซ้ายของช่วง
- หากองค์ประกอบตรงกลางมีขนาดเล็กกว่าเป้าหมาย ให้ค้นหาในครึ่งขวาของช่วง
- ทำซ้ำขั้นตอนที่ 2-6 จนกว่าจะพบองค์ประกอบเป้าหมายหรือช่วงการค้นหาว่างเปล่า
ตัวอย่าง
ลองพิจารณารายการของจำนวนเต็มและต้องการหาหมายเลข 34 โดยใช้การค้นหาแบบไบนารี
รายการเรียง: {12, 23, 34, 45, 56, 67, 89, 90}
- เริ่มต้นด้วยรายการทั้งหมด
- องค์ประกอบกลาง: 56(ตำแหน่ง 4) เปรียบเทียบกับ 34
- 56 มากกว่า 34 ค้นหาในครึ่งซ้าย
- องค์ประกอบตรงกลางใหม่: 23(ตำแหน่ง 1) เปรียบเทียบกับ 34
- 23 น้อยกว่า 34 ค้นหาในครึ่งขวา
- องค์ประกอบตรงกลางใหม่: 45(ตำแหน่ง 3) เปรียบเทียบกับ 34
- 45 มากกว่า 34 ค้นหาในครึ่งซ้าย
- องค์ประกอบตรงกลางใหม่: 34(ตำแหน่ง 2) พบเป้าหมายแล้ว
ตัวอย่างโค้ดในภาษา C++
#include <iostream>
#include <vector>
int binarySearch(const std::vector<int>& arr, int target) {
int left = 0;
int right = arr.size()- 1;
while(left <= right) {
int mid = left +(right- left) / 2;
if(arr[mid] == target) {
return mid;
} else if(arr[mid] < target) {
left = mid + 1;
} else {
right = mid- 1;
}
}
return -1;
}
int main() {
std::vector<int> numbers = {12, 23, 34, 45, 56, 67, 89, 90};
int target = 34;
int result = binarySearch(numbers, target);
if(result != -1) {
std::cout << "Element " << target << " found at position " << result << std::endl;
} else {
std::cout << "Element " << target << " not found in the array" << std::endl;
}
return 0;
}
ในตัวอย่างที่กำหนด binarySearch
ฟังก์ชันนี้ใช้เพื่อค้นหาหมายเลข 34 ในรายการจำนวนเต็มที่เรียงลำดับ ผลลัพธ์จะเป็นตำแหน่ง 34 ในรายการ(ตำแหน่งเริ่มต้นจาก 0) หรือ -1 หากไม่พบหมายเลข