Algoritmalar · 81 satır
İkili arama
Arama aralığı her adımda yarıya iner; elenen bölge söner.
Önizleme · 0.6.0 — dil 1.0 öncesidir; sözdizimi ve kütüphane değişebilir. Buradaki her örnek derlenerek sınanır.
Çalıştırın
Uçbirim
kabalang calistir 03_ikili_arama.kblKaynak kod
03_ikili_arama.kbl
# ╔═══════════════════════════════════════════════════════════════════╗
# ║ İKİLİ ARAMA — arama aralığı her adımda YARIYA iner ║
# ║ Aralık yeşil, orta nokta sarı, elenen bölge soluk çizilir. ║
# ╚═══════════════════════════════════════════════════════════════════╝
kullan kaba.sistem
fonksiyon renkli(yazi: metin, renk: sayi):
don "\033[38;5;" + metin(renk) + "m" + yazi + "\033[0m"
fonksiyon ekrani_temizle():
yazdir("\033[H\033[2J")
fonksiyon durumu_ciz(dizi, sol: sayi, sag: sayi, orta: sayi, hedef: sayi, adim: sayi):
ekrani_temizle()
yazdir("")
yazdir(renkli(" İKİLİ ARAMA — hedef: " + metin(hedef), 81))
yazdir(renkli(" " + "─".tekrarla(52), 238))
satir = " "
i = 0
iken i < dizi.uzunluk():
kutu = metin(dizi[i])
eger dizi[i] < 10:
kutu = " " + kutu
eger i == orta:
satir = satir + renkli("[" + kutu + "]", 220)
degilse:
eger i >= sol:
eger i <= sag:
satir = satir + renkli(" " + kutu + " ", 78)
degilse:
satir = satir + renkli(" " + kutu + " ", 238)
degilse:
satir = satir + renkli(" " + kutu + " ", 238)
i = i + 1
yazdir(satir)
yazdir(renkli(" " + "─".tekrarla(52), 238))
kalan = sag - sol + 1
eger kalan < 0:
kalan = 0
yazdir(renkli(" adım: " + metin(adim) + " kalan aday: " + metin(kalan), 245))
uyu(700)
# ── Sıralı veri ───────────────────────────────────────────────────────
dizi = []
deger = 2
n = 0
iken n < 16:
dizi.ekle(deger)
deger = deger + rastgele.sayi(2, 6)
n = n + 1
hedef = dizi[rastgele.sayi(0, 15)]
# ── Algoritma ─────────────────────────────────────────────────────────
# Her adımda ortadaki değere bakılır; hedef ondan küçükse sağ yarı,
# büyükse sol yarı tümüyle elenir. 16 öğe en çok 4 adımda taranır.
sol = 0
sag = dizi.uzunluk() - 1
adim = 0
bulundu = 0 - 1
iken sol <= sag:
orta =(sol + sag) // 2
adim = adim + 1
durumu_ciz(dizi, sol, sag, orta, hedef, adim)
eger dizi[orta] == hedef:
bulundu = orta
sol = sag + 1
degilse:
eger dizi[orta] < hedef:
sol = orta + 1
degilse:
sag = orta - 1
yazdir("")
eger bulundu >= 0:
yazdir(renkli(" ✓ " + metin(hedef) + " değeri " + metin(bulundu) + ". sırada, " + metin(adim) + " adımda bulundu.", 78))
yazdir(renkli(" Doğrusal arama en kötü " + metin(dizi.uzunluk()) + " adım isterdi.", 245))
degilse:
yazdir(renkli(" ✗ " + metin(hedef) + " dizide yok (" + metin(adim) + " adım).", 203))
yazdir("")