Ikkilik qidiruv
Ikkilik qidiruv (Binary Search) — bu saralangan (tartiblangan) massivdan qidirilayotgan elementning o'rnini topish uchun qo'llaniladigan juda tezkor qidiruv algoritmidir.
Ushbu yondashuvda qidiruv maydoni har bir qadamda ikkiga bo'linadi va element doimo massivning o'rtasidagi element bilan taqqoslanadi.
[!IMPORTANT] Ikkilik qidiruv faqat va faqat elementlari oldindan saralangan massivlarda ishlaydi. Agar elementlar tartiblanmagan bo'lsa, ularni avval saralab olish lozim.
Ikkilik qidiruv algoritmini ikki xil usulda amalga oshirish mumkin:
Har ikkala usulning umumiy mantiqiy bosqichlari quyidagicha:
Qidiruv bajariladigan massiv quyidagicha berilgan:

Dastlabki saralangan massiv (Initial array)
Aytaylik, biz x = 4 elementini qidirmoqdamiz.
Massivning eng boshiga low va eng oxiriga high ko'rsatkichlarini o'rnatamiz:

low va high ko'rsatkichlarini o'rnatish
Massivning o'rtasidagi indeksni hisoblaymiz: mid = (low + high) / 2
Hozirgi holatda mid = (0 + 9) / 2 = 4 bo'lib, arr[mid] = 6 ga teng.

O'rta elementni aniqlash (Mid element)
x == arr[mid] bo'lsa, element topildi va mid indeksi qaytariladi.x < arr[mid] bo'lsa (bizning misolda 4 < 6), demak izlanayotgan son o'rta elementdan chapda joylashgan. Shuning uchun high = mid - 1 qilib, o'ng qismni qidiruvdan butunlay chiqarib tashlaymiz:
O'ng qism bekor qilinib, qidiruv chap tomonda davom ettiriladi
Endi low = 0 va high = 3.
Yangi o'rta indeks: mid = (0 + 3) / 2 = 1 bo'ladi, arr[mid] = 3.

Yangi oraliqdagi o'rta element (mid = 1, arr[mid] = 3)
Endi x ni yana taqqoslaymiz: 4 > 3, demak element mid dan o'ng tomonda.
Shuning uchun low = mid + 1 qilib, chap qismni chiqarib tashlaymiz:
Endi low = 2, high = 3.
mid = (2 + 3) / 2 = 2 bo'lib, arr[mid] = 4 ga teng bo'ladi.
x == arr[mid] sharti bajarildi — element topildi!

Qidirilgan element topildi (indeksi: 2)
Agar low > high holati yuzaga kelsa va element topilmasa, demak bu son massivda mavjud emas.
do until low > high
mid = (low + high) / 2
if (x == arr[mid])
return mid
else if (x > arr[mid])
low = mid + 1
else
high = mid - 1
return -1
binarySearch(arr, x, low, high)
if low > high
return -1
else
mid = (low + high) / 2
if x == arr[mid]
return mid
else if x > arr[mid]
return binarySearch(arr, x, mid + 1, high)
else
return binarySearch(arr, x, low, mid - 1)
Quyida iterativ va rekursiv usullarning to'liq dasturiy kodi keltirilgan:
// Go tilida Binary Search (Iterativ va Rekursiv)
package main
import "fmt"
// Iterativ ikkilik qidiruv
func binarySearchIterative(arr []int, x int) int {
low := 0
high := len(arr) - 1
for low <= high {
mid := low + (high-low)/2
if arr[mid] == x {
return mid
}
if arr[mid] < x {
low = mid + 1
} else {
high = mid - 1
}
}
return -1
}
// Rekursiv ikkilik qidiruv
func binarySearchRecursive(arr []int, x, low, high int) int {
if low > high {
return -1
}
mid := low + (high-low)/2
if arr[mid] == x {
return mid
}
if arr[mid] > x {
return binarySearchRecursive(arr, x, low, mid-1)
}
return binarySearchRecursive(arr, x, mid+1, high)
}
func main() {
arr := []int{3, 4, 5, 6, 7, 8, 9}
x := 4
result := binarySearchIterative(arr, x)
if result == -1 {
fmt.Println("Element topilmadi")
} else {
fmt.Printf("Element %d-indeksda topildi (Iterativ)\n", result)
}
resultRec := binarySearchRecursive(arr, x, 0, len(arr)-1)
fmt.Printf("Element %d-indeksda topildi (Rekursiv)\n", resultRec)
}O(1) — agar qidirilayotgan element massivning qoq o'rtasida turgan bo'lsa.O(log n) — massiv har qadamda teng ikkiga qisqarib boradi (N/2, N/4, ..., 1).O(log n).Masalan, 1 000 000 ta saralangan elementdan iborat massivda istalgan elementni topish uchun ko'pi bilan atigi 20 ta taqqoslash yetarli bo'ladi!
O(1) (qo'shimcha xotira sarflanmaydi).O(log n) (chaqiruvlar steki uchun).std::binary_search, lower_bound, upper_bound, Go da sort.Search).