# Fungsi jejak Binary Search
jejak_binary <- function(data, target) {
  kiri <- 1
  kanan <- length(data)
  jejak <- data.frame()

  while (kiri <= kanan) {
    tengah <- (kiri + kanan) %/% 2

    jejak <- rbind(jejak, data.frame(
      kiri = kiri,
      kanan = kanan,
      tengah = tengah,
      nilai_tengah = data[tengah]
    ))

    if (data[tengah] == target) {
      break
    } else if (data[tengah] < target) {
      kiri <- tengah + 1
    } else {
      kanan <- tengah - 1
    }
  }

  return(jejak)
}

# Fungsi Binary Search dengan validasi
bin_boolean <- function(data, target) {
  if (is.unsorted(data)) {
    stop("Data harus terurut!")
  }

  kiri <- 1
  kanan <- length(data)

  while (kiri <= kanan) {
    tengah <- (kiri + kanan) %/% 2

    if (data[tengah] == target) {
      return(tengah)
    } else if (data[tengah] < target) {
      kiri <- tengah + 1
    } else {
      kanan <- tengah - 1
    }
  }

  return(NA)
}

# Fungsi mencari posisi pertama pada data duplikat
bin_pertama <- function(data, target) {
  if (is.unsorted(data)) {
    stop("Data harus terurut!")
  }

  kiri <- 1
  kanan <- length(data)
  hasil <- NA

  while (kiri <= kanan) {
    tengah <- (kiri + kanan) %/% 2

    if (data[tengah] == target) {
      hasil <- tengah
      kanan <- tengah - 1
    } else if (data[tengah] < target) {
      kiri <- tengah + 1
    } else {
      kanan <- tengah - 1
    }
  }

  return(hasil)
}

# Menghitung kunjungan Sequential Search
kunjungan_sequential <- function(data, target) {
  jumlah <- 0

  for (i in seq_along(data)) {
    jumlah <- jumlah + 1

    if (data[i] == target) {
      return(jumlah)
    }
  }

  return(jumlah)
}