KABAFORCEGeliştirici KabaOS'u edinin

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.kbl

Kaynak 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("")