# 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)
}