อัลกอริธึมการค้นหาแบบไบนารีเป็นอัลกอริธึมที่อิงตามกลไกการเปรียบเทียบและการแยก อัลกอริทึมการค้นหาแบบไบนารีเรียกอีกอย่างว่า การค้นหาครึ่งช่วง การค้นหาแบบลอการิทึม หรือไบนารีสับ . อัลกอริทึมการค้นหาไบนารี ค้นหาตำแหน่งของค่าเป้าหมายในอาร์เรย์ที่เรียงลำดับ จะเปรียบเทียบค่าเป้าหมายกับองค์ประกอบตรงกลางของอาร์เรย์ หากองค์ประกอบเท่ากับองค์ประกอบเป้าหมาย อัลกอริทึมจะส่งกลับดัชนี ของธาตุที่พบ และหากไม่เท่ากัน อัลกอริธึมการค้นหาจะใช้ครึ่งหนึ่งของอาร์เรย์นั้น โดยอิงจากการเปรียบเทียบค่า อัลกอริธึมใช้ครึ่งแรกอย่างใดอย่างหนึ่ง ( เมื่อค่าน้อยกว่าค่ากลาง ) และครึ่งหลัง ( เมื่อค่ามากกว่าค่ากลาง ) และทำเช่นเดียวกันสำหรับครึ่งอาร์เรย์ถัดไป
Input:
A[] = {0,2,6,11,12,18,34,45,55,99}
n=55
Output:
55 at Index = 8 คำอธิบาย
สำหรับอาร์เรย์ของเรา -
เราจะเปรียบเทียบ 55 กับองค์ประกอบตรงกลางของอาร์เรย์ซึ่งก็คือ 18 ซึ่งน้อยกว่า 55 ดังนั้นเราจะใช้ครึ่งหลังของอาร์เรย์ เช่น อาร์เรย์ {24, 45, 55, 99} อีกครั้ง ค่ากลางคือ 55 ตรวจสอบค่าขององค์ประกอบการค้นหาด้วย และค่าที่ตรงกันแล้วเราจะคืนค่าดัชนีของค่านี้ด้วย 8
หากองค์ประกอบการค้นหามีขนาดเล็กกว่าตรงกลางมากกว่าที่เราจะใช้ครึ่งแรกและดำเนินต่อไปจนกว่าจะพบองค์ประกอบที่กึ่งกลางของอาร์เรย์
ในการดำเนินการค้นหาแบบไบนารี เราสามารถเขียนโค้ดได้สองวิธี สองวิธีนี้จะเลื่อนออกไปในลักษณะที่เราเรียกใช้ฟังก์ชันที่ตรวจสอบองค์ประกอบการค้นหาแบบไบนารีเท่านั้น คือ:
-
การใช้การวนซ้ำ − นี่หมายถึงการใช้ลูปภายในฟังก์ชันที่ตรวจสอบความเท่าเทียมกันขององค์ประกอบตรงกลาง
-
การใช้ ในวิธีนี้ ฟังก์ชันจะเรียกตัวเองซ้ำแล้วซ้ำอีกด้วยชุดค่าที่ต่างกัน
ตัวอย่าง
#include<stdio.h>
int iterativeBsearch(int A[], int size, int element);
int main() {
int A[] = {0,12,6,12,12,18,34,45,55,99};
int n=55;
printf("%d is found at Index %d \n",n,iterativeBsearch(A,10,n));
return 0;
}
int iterativeBsearch(int A[], int size, int element) {
int start = 0;
int end = size-1;
while(start<=end) {
int mid = (start+end)/2;
if( A[mid] == element) {
return mid;
} else if( element < A[mid] ) {
end = mid-1;
} else {
start = mid+1;
}
}
return -1;
} ผลลัพธ์
55 is found at Index 8
ตัวอย่าง
#include<stdio.h>
int RecursiveBsearch(int A[], int start, int end, int element) {
if(start>end) return -1;
int mid = (start+end)/2;
if( A[mid] == element ) return mid;
else if( element < A[mid] )
RecursiveBsearch(A, start, mid-1, element);
else
RecursiveBsearch(A, mid+1, end, element);
}
int main() {
int A[] = {0,2,6,11,12,18,34,45,55,99};
int n=55;
printf("%d is found at Index %d \n",n,RecursiveBsearch(A,0,9,n));
return 0;
} ผลลัพธ์
55 is found at Index 8