#1.Larik setelah setelah setiap pass.
data <- c(25, 22, 18, 20, 15)

n <- length(data)

for (i in 1:(n-1)) {
  max_idx <- i
  
  for (j in (i+1):n) {
    if (data[j] > data[max_idx]) {
      max_idx <- j
    }
  }
  
  temp <- data[i]
  data[i] <- data[max_idx]
  data[max_idx] <- temp
  
  cat("Pass", i, ":")
  print(data)
}
## Pass 1 :[1] 25 22 18 20 15
## Pass 2 :[1] 25 22 18 20 15
## Pass 3 :[1] 25 22 20 18 15
## Pass 4 :[1] 25 22 20 18 15
data <- c(25, 22, 18, 20, 15)

n <- length(data)

for (i in n:2) {
  min_idx <- 1
  
  for (j in 2:i) {
    if (data[j] < data[min_idx]) {
      min_idx <- j
    }
  }
  
  temp <- data[i]
  data[i] <- data[min_idx]
  data[min_idx] <- temp
  
  cat("Pass", n-i+1, ":")
  print(data)
}
## Pass 1 :[1] 25 22 18 20 15
## Pass 2 :[1] 25 22 20 18 15
## Pass 3 :[1] 25 22 20 18 15
## Pass 4 :[1] 25 22 20 18 15
#2.Hitung banyak perbandingan dan pergeseran.
insertion_sort <- function(data) {
  
  n <- length(data)
  perbandingan <- 0
  pergeseran <- 0
  
  for (i in 2:n) {
    
    key <- data[i]
    j <- i - 1
    
    while (j >= 1) {
      
      perbandingan <- perbandingan + 1
      
      if (data[j] > key) {
        data[j+1] <- data[j]
        pergeseran <- pergeseran + 1
        j <- j - 1
      } else {
        break
      }
    }
    
    data[j+1] <- key
    
    cat("Pass", i-1, ":")
    print(data)
  }
  
  cat("Hasil akhir:", data, "\n")
  cat("Jumlah perbandingan:", perbandingan, "\n")
  cat("Jumlah pergeseran:", pergeseran, "\n")
}

# Data pertama
cat("DATA PERTAMA\n")
## DATA PERTAMA
insertion_sort(c(5, 4, 3, 2, 1))
## Pass 1 :[1] 4 5 3 2 1
## Pass 2 :[1] 3 4 5 2 1
## Pass 3 :[1] 2 3 4 5 1
## Pass 4 :[1] 1 2 3 4 5
## Hasil akhir: 1 2 3 4 5 
## Jumlah perbandingan: 10 
## Jumlah pergeseran: 10
# Data kedua
cat("\nDATA KEDUA\n")
## 
## DATA KEDUA
insertion_sort(c(1, 2, 3, 5, 4))
## Pass 1 :[1] 1 2 3 5 4
## Pass 2 :[1] 1 2 3 5 4
## Pass 3 :[1] 1 2 3 5 4
## Pass 4 :[1] 1 2 3 4 5
## Hasil akhir: 1 2 3 4 5 
## Jumlah perbandingan: 5 
## Jumlah pergeseran: 1
#3.urutan relatif elemen yang bernilai sama
data <- data.frame(
  nama = c("Ani", "Budi", "Citra"),
  nilai = c(5, 5, 3)
)

print(data)
##    nama nilai
## 1   Ani     5
## 2  Budi     5
## 3 Citra     3
n <- nrow(data)

for (i in 1:(n-1)) {
  
  min_idx <- i
  
  for (j in (i+1):n) {
    if (data$nilai[j] < data$nilai[min_idx]) {
      min_idx <- j
    }
  }
  
  temp <- data[i, ]
  data[i, ] <- data[min_idx, ]
  data[min_idx, ] <- temp
}

cat("Hasil Selection Sort:\n")
## Hasil Selection Sort:
print(data)
##    nama nilai
## 1 Citra     3
## 2  Budi     5
## 3   Ani     5
#4.Binary search
binary_insertion_sort <- function(data) {
  
  n <- length(data)
  perbandingan <- 0
  pergeseran <- 0
  
  for (i in 2:n) {
    
    key <- data[i]
    low <- 1
    high <- i - 1
    
    # Binary Search
    while (low <= high) {
      
      mid <- floor((low + high) / 2)
      perbandingan <- perbandingan + 1
      
      if (data[mid] <= key) {
        low <- mid + 1
      } else {
        high <- mid - 1
      }
    }
    
    # Menggeser elemen
    j <- i - 1
    
    while (j >= low) {
      data[j+1] <- data[j]
      pergeseran <- pergeseran + 1
      j <- j - 1
    }
    
    data[low] <- key
    
    cat("Pass", i-1, ":")
    print(data)
  }
  
  cat("Hasil akhir:", data, "\n")
  cat("Jumlah perbandingan:", perbandingan, "\n")
  cat("Jumlah pergeseran:", pergeseran, "\n")
}

binary_insertion_sort(c(5, 4, 3, 2, 1))
## Pass 1 :[1] 4 5 3 2 1
## Pass 2 :[1] 3 4 5 2 1
## Pass 3 :[1] 2 3 4 5 1
## Pass 4 :[1] 1 2 3 4 5
## Hasil akhir: 1 2 3 4 5 
## Jumlah perbandingan: 6 
## Jumlah pergeseran: 10
#5.data eustockmarkets
data <- EuStockMarkets[1:50, "CAC"]

selection_sort <- function(data) {
  
  n <- length(data)
  perbandingan <- 0
  pertukaran <- 0
  
  for (i in 1:(n-1)) {
    
    max_idx <- i
    
    for (j in (i+1):n) {
      
      perbandingan <- perbandingan + 1
      
      if (data[j] > data[max_idx]) {
        max_idx <- j
      }
    }
    
    if (max_idx != i) {
      temp <- data[i]
      data[i] <- data[max_idx]
      data[max_idx] <- temp
      
      pertukaran <- pertukaran + 1
    }
  }
  
  cat("Hasil Selection Sort:\n")
  print(data)
  
  cat("Jumlah perbandingan:", perbandingan, "\n")
  cat("Jumlah pertukaran:", pertukaran, "\n")
}

selection_sort(data)
## Hasil Selection Sort:
##  [1] 1873.2 1868.7 1864.3 1863.5 1860.8 1860.4 1857.7 1853.4 1851.8 1849.7
## [11] 1833.5 1820.3 1820.3 1820.3 1819.1 1808.8 1792.9 1789.5 1783.5 1782.4
## [21] 1780.4 1780.1 1778.1 1772.8 1768.9 1767.7 1766.8 1766.5 1763.5 1762.8
## [31] 1762.2 1759.8 1759.5 1758.1 1757.9 1757.5 1757.4 1756.6 1755.5 1754.7
## [41] 1754.3 1754.0 1750.5 1734.5 1725.6 1723.1 1718.0 1714.3 1708.1 1687.5
## Jumlah perbandingan: 1225 
## Jumlah pertukaran: 47
data <- EuStockMarkets[1:50, "CAC"]

insertion_sort <- function(data) {
  
  n <- length(data)
  perbandingan <- 0
  pergeseran <- 0
  
  for (i in 2:n) {
    
    key <- data[i]
    j <- i - 1
    
    while (j >= 1) {
      
      perbandingan <- perbandingan + 1
      
      if (data[j] < key) {
        data[j+1] <- data[j]
        pergeseran <- pergeseran + 1
        j <- j - 1
      } else {
        break
      }
    }
    
    data[j+1] <- key
  }
  
  cat("Hasil Insertion Sort:\n")
  print(data)
  
  cat("Jumlah perbandingan:", perbandingan, "\n")
  cat("Jumlah pergeseran:", pergeseran, "\n")
}

insertion_sort(data)
## Hasil Insertion Sort:
##  [1] 1873.2 1868.7 1864.3 1863.5 1860.8 1860.4 1857.7 1853.4 1851.8 1849.7
## [11] 1833.5 1820.3 1820.3 1820.3 1819.1 1808.8 1792.9 1789.5 1783.5 1782.4
## [21] 1780.4 1780.1 1778.1 1772.8 1768.9 1767.7 1766.8 1766.5 1763.5 1762.8
## [31] 1762.2 1759.8 1759.5 1758.1 1757.9 1757.5 1757.4 1756.6 1755.5 1754.7
## [41] 1754.3 1754.0 1750.5 1734.5 1725.6 1723.1 1718.0 1714.3 1708.1 1687.5
## Jumlah perbandingan: 1069 
## Jumlah pergeseran: 1031