เมนูนำทาง
การค้นหาแบบทวิภาค ขั้นตอนวิธีการค้นหาแบบทวิภาคสามารถใช้การเรียกซ้ำได้ โดยมีสิ่งที่ต้องการคือพารามิเตอร์อันได้แก่ แถวลำดับที่มีการเรียงลำดับมากแล้ว(ในต้วอย่างจะเป็นการเรียงลำดับจากน้อยไปมาก) และแน่นอนว่าต้องสามารถอ้างถึงแถวลำดับตรงการด้วยดัชนี(index)ต้นและปลายของแถวลำดับ ซึ่งพารามิเตอร์เหล่านี้จะทำให้สามารถเรียกฟังก์ชันแบบเรียกซ้ำได้ และโดยขั้นตอนวิธีแล้ว การเขียนการค้นหาแบบทวิภาคด้วยการเวียนเกิดหรือเรียกซ้ำนั้นคอมไพเลอร์จะไม่มีการสร้างกองซ้อนกองใหม่ขึ้นมาโดยจะใช้เพียงกองเดียวเท่านั้น พิจารณาที่ตัวแปร a
คือแถวลำดับที่ต้องการค้นหา key
คือค่าของตัวแปรที่ต้องการค้นหาในแถวลำดับ a left
คือดัชนีของต้นแถวลำดับ a และ right
คือดัชนีของปลายแถวลำดับ a
int binary_search(int a[], int key, int left, int right){ if(left > right) //ถ้าค่าของ left มากกว่า right แสดงว่าแถวลำดับย่อยไม่มีสมาชิกเหลืออยู่แล้ว และไม่มี key ที่ต้องการ return -1; //คืนค่าที่ต้องการแสดงว่าไม่พบค่า key else //ถ้ายังมีสมาชิกอยู่ก็ทำการค้นหาต่อไป { int mid = (left+right)/2; //mid ดัชนีตรงกลางของแถวลำดับย่อยหรือหลัก if(a[mid]>key) //ถ้าค่าตรงกลางของแถวลำมีค่ามากกว่า key แสดงว่า key ต้องอยู่ระหว่าง a[left] กับ a[mid-1] return binary_search(a,key,left,mid-1); //ดังนั้นจึงไปค้นหาต่อในแถวลำดับย่อยระหว่าง left และ mid-1 if(a[mid]<key) //ในทำนองเดียวกันกับ ค่าตรงกลางของแถวลำมีค่ามากกว่า key return binary_search(a,key,mid+1,right); if(a[mid]==key) //หากค่าตรงการของแถวลำกับมีค่าเท่ากับ key แสดงว่าพบแล้ว return mid; //คืนค่าตำแหน่งของ key ในแถวลำดับ a กลับไป }}
โดยจะให้ค่าของ left
เท่ากับ 0
และ right
เท่ากับ N-1
สำหรับแถวลำดับที่มีจุดเริ่มที่ศูนย์และมีสมาชิก N ตัว ดังนั้นเราจึงได้ค่าของ mid
หรือ ดัชนีที่ชี้ตรงกลางของแถวลำดับที่เริ่มต้นที่ left
ถึง right
นั่นคือจะมีค่าเท่ากับ (left+right)/2
การค้นหาแบบทวิภาคยังสามารถในแบบการวนซ้ำได้เนี่องจากการค้นหาแบบนี้มีการทำงานเป็นเชิงเส้นไม่ได้มีการแตกการทำงานแต่อย่างใด[3]
1 int binary_search(int a[], int key, int left, int right) 2 { 3 while (left <= right) 4 { 5 int mid = (left+right)/2; 6 if (a[mid] < key) 7 left = mid + 1; 8 else if (a[mid] > key) 9 right = mid - 1;10 else //พบ key ในแถวลำดับ a แล้ว11 return mid;12 }13 // ไม่พบ key14 return -1;15 }
เมนูนำทาง
การค้นหาแบบทวิภาค ขั้นตอนวิธีใกล้เคียง
การค้าประเวณี การค้าประเวณีเด็ก การค้าประเวณีในประเทศไทย การค้นหาแบบทวิภาค การค้าเครื่องเทศ การค้นหาแบบเอสตาร์ การค้นหาและกู้ภัยในเขตเมือง การค้นหาในแนวกว้าง การค้าระหว่างประเทศ การค้นหาในแนวลึกแบบวนเพิ่มความลึกแหล่งที่มา
WikiPedia: การค้นหาแบบทวิภาค http://www.codecodex.com/wiki/Binary_search http://www.eexploria.com/wp-content/uploads/2012/0... http://www.mathmeth.com/wf/files/wf2xx/wf214.pdf http://mathworld.wolfram.com/BinarySearch.html http://www.nist.gov/dads/HTML/binarySearch.html