Makalah Searching Dan Sorting
Makalah Searching Dan Sorting
Puji syukur ke hadirat Tuhan Yang Maha Esa yang telah melimpahkan rahmat dan
karunia-Nya, sehingga kami dapat menyelesaikan makalah yang berjudul "Sorting
dan Searching: Konsep dan Implementasi Algoritma" ini tepat pada waktunya.
Makalah ini disusun sebagai salah satu bentuk tugas untuk memahami konsep dan
implementasi algoritma Sorting dan Searching, yang memiliki peranan penting dalam
bidang pemrograman dan pengolahan data. Kami berharap makalah ini dapat
memberikan wawasan bagi pembaca mengenai pentingnya efisiensi algoritma dalam
pengelolaan data.
Kami menyadari bahwa makalah ini masih jauh dari sempurna. Oleh karena itu,
kami dengan senang hati menerima kritik dan saran dari berbagai pihak untuk
memperbaiki dan menyempurnakan karya ini di masa mendatang.
Pada kesempatan ini, kami juga mengucapkan terima kasih kepada semua pihak
yang telah memberikan bantuan, baik berupa dukungan moral maupun material,
sehingga makalah ini dapat terselesaikan dengan baik.
Semoga makalah ini dapat memberikan manfaat dan menambah wawasan bagi
pembaca, khususnya dalam bidang algoritma dan struktur data.
DAFTAR ISI
1
KATA PENGANTAR....................................................................................................1
DAFTAR ISI..................................................................................................................2
BAB I.............................................................................................................................4
1.1 LATAR BELAKANG..........................................................................................4
1.2 RUMUSAN MASALAH.....................................................................................5
1.3 TUJUAN PENULISAN.......................................................................................5
1.4 MANFAAT PENULISAN...................................................................................6
BAB II...........................................................................................................................7
LANDASAN TEORI....................................................................................................7
2.1 PENGENALAN SORTING DAN SEARCHING...............................................7
2.2 PENTINGNYA SORTING DAN SEARCHING DALAM PEMROGRAMAN.8
2.3 ALGORITMA DAN KOMPLEKSITAS WAKTU............................................10
BAB III........................................................................................................................14
IMPLEMENTASI SORTING DALAM BAHASA C.................................................14
3.1 BUBBLE SORT.................................................................................................14
Output Program:...................................................................................................15
3.2 SELECTION SORT...........................................................................................16
3.3 INSERTION SORT............................................................................................18
Output Program:...................................................................................................19
3.4 MERGE SORT...................................................................................................20
Output Program:...................................................................................................23
3.5 QUICK SORT....................................................................................................23
Output Program:...................................................................................................26
3.6 PERBANDINGAN DAN EFISIENSI SORTING.............................................26
BAB IV........................................................................................................................30
IMPLEMENTASI SEARCHING DALAM BAHASA C...........................................30
4.1 LINEAR SEARCH............................................................................................30
Output Program:...................................................................................................32
4.2 BINARY SEARCH............................................................................................32
Output Program:...................................................................................................35
2
4.3 IMPLEMENTASI PADA DATA ARRAY.........................................................35
4.4 STUDI KASUS DAN ANALISIS EFISIENSI.................................................38
BAB VI........................................................................................................................42
KESIMPULAN DAN SARAN...................................................................................42
6.1 KESIMPULAN..................................................................................................42
6.2 SARAN..............................................................................................................43
6.3 DAFTAR PUSTAKA.........................................................................................45
BAB I
PENDAHULUAN
3
1.1 LATAR BELAKANG
Sorting (pengurutan) dan searching (pencarian) adalah dua konsep dasar dalam
ilmu komputer yang memiliki peran penting dalam pengelolaan dan manipulasi data.
Kedua konsep ini menjadi pondasi bagi berbagai algoritma dan aplikasi dalam
pemrograman, termasuk dalam bahasa C.
Sorting
Sorting adalah proses mengatur elemen data dalam suatu urutan tertentu, seperti
urutan menaik (ascending) atau menurun (descending). Teknik pengurutan sangat
penting untuk meningkatkan efisiensi dalam pengolahan data, seperti pencarian data,
penghapusan duplikasi, dan analisis data. Dalam bahasa C, terdapat berbagai
algoritma sorting yang dapat diimplementasikan, di antaranya:
Bubble Sort: Algoritma sederhana yang membandingkan elemen berdekatan
dan menukarnya jika tidak sesuai urutan.
Selection Sort: Algoritma yang memilih elemen terkecil atau terbesar dari
daftar dan menempatkannya di posisi yang sesuai.
Quick Sort: Salah satu algoritma yang sangat efisien dengan teknik divide-
and-conquer.
Merge Sort: Menggabungkan dua subarray yang telah diurutkan
menggunakan pendekatan rekursif.
Searching
Searching adalah proses menemukan data tertentu dalam kumpulan data
berdasarkan kriteria tertentu. Algoritma searching yang efisien membantu
mempercepat pengambilan informasi dari basis data atau struktur data.
Contoh algoritma searching dalam bahasa C meliputi:
Linear Search: Metode sederhana yang memeriksa elemen satu per satu
hingga menemukan data yang dicari.
Binary Search: Algoritma yang lebih cepat tetapi hanya dapat digunakan pada
data yang sudah terurut, dengan membagi ruang pencarian menjadi dua setiap
kali.
Hashing: Teknik pencarian yang menggunakan struktur data hash untuk
menemukan elemen secara langsung.
Pentingnya Sorting dan Searching
Dalam dunia nyata, sorting dan searching sering diterapkan pada berbagai
aplikasi, seperti:
4
2. Pencarian Internet: Mesin pencari menggunakan algoritma searching untuk
menemukan informasi dengan cepat.
3. E-commerce: Mengurutkan barang berdasarkan harga, popularitas, atau
relevansi.
Implementasi sorting dan searching dalam bahasa C melibatkan pemahaman
tentang struktur data seperti array, pointer, dan rekursi, yang menjadikannya
alat penting bagi pengembang perangkat lunak untuk memproses data secara
efisien.
5
Memberikan pemahaman tentang cara mengoptimalkan proses sorting dan
searching untuk meningkatkan efisiensi dalam pengolahan data.
Tujuan ini diharapkan dapat membantu pembaca memahami dan menerapkan
algoritma sorting dan searching dengan tepat dalam pemrograman
menggunakan bahasa C.
6
BAB II
LANDASAN TEORI
2.1 PENGENALAN SORTING DAN SEARCHING
Sorting (pengurutan) dan searching (pencarian) adalah dua konsep fundamental
dalam ilmu komputer yang sering digunakan untuk mengelola dan memproses data.
Keduanya memainkan peran penting dalam berbagai aplikasi mulai dari sistem basis
data hingga kecerdasan buatan.
1. Sorting (Pengurutan)
Sorting adalah proses mengatur data dalam suatu urutan tertentu, baik secara
menaik (ascending) maupun menurun (descending). Proses ini mempermudah
pengolahan data, seperti pencarian, pengelompokan, dan analisis.
Tujuan Sorting:
Mengatur data agar lebih terstruktur dan memudahkan pengambilan
informasi.
Contoh Penggunaan Sorting:
Dalam e-commerce, barang diurutkan berdasarkan harga, popularitas, atau
ulasan pelanggan.
Beberapa algoritma sorting umum meliputi:
1. Bubble Sort: Algoritma sederhana yang membandingkan dan menukar elemen
yang tidak sesuai urutan.
2. Insertion Sort: Memasukkan elemen ke dalam posisi yang benar pada daftar
yang sudah terurut.
3. Quick Sort: Menggunakan pendekatan divide and conquer untuk membagi
data menjadi sub-kelompok kecil.
4. Merge Sort: Menggabungkan dua subarray terurut menjadi satu array terurut.
2. Searching (Pencarian)
Searching adalah proses menemukan elemen tertentu dalam kumpulan data.
Teknik pencarian yang efisien sangat penting untuk mempercepat proses pengambilan
data.
7
Tujuan Searching:
Mengambil informasi yang spesifik dari data yang besar.
Contoh Penggunaan Searching
Dalam mesin pencari, menemukan hasil yang relevan dari kata kunci pengguna.
Beberapa algoritma searching populer meliputi:
1. Linear Search: Memeriksa elemen satu per satu hingga elemen yang dicari
ditemukan.
2. Binary Search: Membagi ruang pencarian menjadi dua pada setiap langkah
untuk menemukan elemen. (Hanya bisa digunakan pada data yang sudah
terurut.)
3. Hashing: Menggunakan struktur data hash untuk pencarian cepat berdasarkan
kunci tertentu.
Keterkaitan Sorting dan Searching
Sorting sering kali menjadi langkah awal yang diperlukan untuk meningkatkan
efisiensi algoritma searching. Sebagai contoh, Binary Search hanya bisa dilakukan
pada data yang sudah terurut, sehingga sorting menjadi prasyaratnya.
Dengan pemahaman mendalam tentang sorting dan searching, pengembang
perangkat lunak dapat mengolah data dengan cara yang lebih cepat dan efisien, baik
dalam skala kecil maupun besar.
8
proses pencarian menjadi lebih sederhana dan cepat, terutama jika menggunakan
algoritma seperti Binary Search.
9
(big data), kemampuan untuk mengelola data dengan cepat adalah hal yang sangat
penting.
Dengan memahami dan menerapkan algoritma sorting dan searching secara
efektif, pengembang dapat menciptakan program yang lebih cepat, efisien, dan andal
untuk berbagai kebutuhan komputasi.
A. Sorting (Pengurutan)
1. Bubble Sort
o Cara Kerja: Membandingkan elemen yang berdekatan dan menukar
posisi jika elemen tidak sesuai urutan.
o Kompleksitas Waktu:
Kasus terbaik: O(n)O(n)O(n) (saat data sudah terurut).
Kasus rata-rata: O(n2)O(n^2)O(n2).
Kasus terburuk: O(n2)O(n^2)O(n2).
o Kelebihan: Implementasi sederhana.
o Kekurangan: Tidak efisien untuk dataset besar.
2. Selection Sort
o Cara Kerja: Memilih elemen terkecil dari daftar yang belum terurut,
lalu menukarnya dengan elemen di posisi awal.
o Kompleksitas Waktu:
Kasus terbaik, rata-rata, dan terburuk: O(n2)O(n^2)O(n2).
10
o Kelebihan: Mudah dipahami.
o Kekurangan: Lambat untuk dataset besar.
3. Quick Sort
o Cara Kerja: Memilih elemen pivot, lalu membagi data menjadi dua
subarray berdasarkan pivot.
o Kompleksitas Waktu:
Kasus terbaik dan rata-rata: O(nlogn)O(n \log n)O(nlogn).
Kasus terburuk: O(n2)O(n^2)O(n2) (jika pivot dipilih buruk).
o Kelebihan: Sangat cepat untuk dataset besar.
o Kekurangan: Sensitif terhadap pemilihan pivot.
4. Merge Sort
o Cara Kerja: Membagi data menjadi subarray kecil, mengurutkan setiap
subarray, dan menggabungkannya kembali.
o Kompleksitas Waktu:
Semua kasus: O(nlogn)O(n \log n)O(nlogn).
o Kelebihan: Stabil dan efisien untuk data besar.
o Kekurangan: Memerlukan ruang memori tambahan.
B. Searching (Pencarian)
1. Linear Search
o Cara Kerja: Memeriksa setiap elemen satu per satu hingga menemukan
elemen yang dicari.
o Kompleksitas Waktu:
Kasus terbaik: O(1)O(1)O(1) (elemen ditemukan di awal).
Kasus rata-rata dan terburuk: O(n)O(n)O(n).
11
o Kelebihan: Mudah diimplementasikan.
o Kekurangan: Lambat untuk dataset besar.
2. Binary Search
o Cara Kerja: Membagi ruang pencarian menjadi dua pada setiap
langkah. (Data harus terurut.)
o Kompleksitas Waktu:
Semua kasus: O(logn)O(\log n)O(logn).
o Kelebihan: Sangat cepat untuk data terurut.
o Kekurangan: Hanya dapat digunakan pada data yang telah diurutkan.
3. Hashing
o Cara Kerja: Menggunakan fungsi hash untuk menentukan posisi
elemen dalam struktur data.
o Kompleksitas Waktu:
Kasus terbaik: O(1)O(1)O(1).
Kasus terburuk: O(n)O(n)O(n) (jika terjadi collision).
o Kelebihan: Cepat untuk pencarian langsung.
o Kekurangan: Membutuhkan ruang penyimpanan tambahan untuk tabel
hash.
Lambat,
Bubble
O(n)O(n)O(n) O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2) cocok untuk
Sort
dataset kecil.
12
Algoritma Kasus Terbaik Kasus Rata-rata Kasus Terburuk Catatan
Selection Implementasi
O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2)
Sort mudah.
Sangat cepat
Quick O(nlogn)O(n \log O(nlogn)O(n \log
O(n2)O(n^2)O(n2) untuk data
Sort n)O(nlogn) n)O(nlogn)
besar.
Stabil,
Merge O(nlogn)O(n \log O(nlogn)O(n \log O(nlogn)O(n \log memerlukan
Sort n)O(nlogn) n)O(nlogn) n)O(nlogn) memori
tambahan.
Linear Sederhana
O(1)O(1)O(1) O(n)O(n)O(n) O(n)O(n)O(n)
Search tetapi lambat.
13
BAB III
// Tukar elemen
arr[j + 1] = temp;
14
}
printf("\n");
int main() {
printArray(arr, n);
bubbleSort(arr, n);
printArray(arr, n);
return 0;
Penjelasan Program:
1. Fungsi bubbleSort:
Menggunakan dua loop bersarang.
Loop luar memastikan proses pengurutan diulang sebanyak ukuran
array dikurangi satu.
Loop dalam membandingkan setiap pasangan elemen yang berdekatan
dan menukar posisinya jika tidak sesuai urutan.
2. Fungsi printArray:
Mencetak elemen array dengan format yang rapi.
3. Bagian main:
Mendefinisikan array yang akan diurutkan.
Menampilkan array sebelum dan setelah proses pengurutan.
15
Output Program:
Array sebelum diurutkan:
64 34 25 12 22 11 90
Array setelah diurutkan:
11 12 22 25 34 64 90
minIndex = j;
arr[minIndex] = arr[i];
arr[i] = temp;
16
printf("\n");
int main() {
printArray(arr, n);
selectionSort(arr, n);
printArray(arr, n);
return 0;
Penjelasan Program:
1. Fungsi selectionSort:
o Loop pertama memilih elemen awal sebagai yang terkecil.
o Loop kedua mencari elemen terkecil dari sisa array dan menyimpan
indeksnya di minIndex.
o Setelah selesai membandingkan, elemen terkecil ditukar dengan
elemen di posisi awal.
2. Fungsi printArray:
o Berfungsi untuk mencetak elemen array dalam format rapi.
3. Bagian main:
o Mendefinisikan array awal.
o Menampilkan array sebelum dan sesudah proses pengurutan.
17
Output Program:
Array sebelum diurutkan:
64 25 12 22 11
int j = i - 1;
arr[j + 1] = arr[j];
j = j - 1;
arr[j + 1] = key;
18
}
printf("\n");
int main() {
printArray(arr, n);
insertionSort(arr, n);
printArray(arr, n);
return 0;
Penjelasan Program:
1. Fungsi insertionSort:
o Mulai dengan elemen kedua (i = 1), ambil nilai elemen tersebut
sebagai key.
o Bandingkan elemen-elemen yang ada di sebelah kiri key dan geser
elemen-elemen yang lebih besar satu posisi ke kanan untuk memberi
ruang bagi key.
o Sisipkan key pada posisi yang tepat setelah geseran. Proses ini diulang
hingga seluruh array terurut.
2. Fungsi printArray:
o Digunakan untuk mencetak elemen array ke layar.
3. Bagian main:
o Mendefinisikan array dan mencetaknya sebelum dan sesudah proses
pengurutan.
Output Program:
19
Array sebelum diurutkan:
64 25 12 22 11
int i = 0, j = 0, k = left;
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
20
j++;
k++;
arr[k] = L[i];
i++;
k++;
arr[k] = R[j];
j++;
k++;
21
// Fungsi untuk mencetak array
printf("\n");
int main() {
printArray(arr, n);
mergeSort(arr, 0, n - 1);
printArray(arr, n);
return 0;
Penjelasan Program:
1. Fungsi merge:
o Fungsi ini menggabungkan dua subarray yang sudah terurut menjadi
satu array yang terurut.
o Array kiri dan kanan dibandingkan elemen demi elemen dan disalin
kembali ke array utama.
22
2. Fungsi mergeSort:
o Fungsi ini membagi array menjadi dua bagian secara rekursif hingga
setiap subarray hanya memiliki satu elemen. Kemudian, fungsi merge
digunakan untuk menggabungkan dua subarray yang sudah terurut.
o Fungsi rekursif ini membagi array hingga bagian terkecil (elemen
tunggal) sebelum melakukan penggabungan dan pengurutan.
3. Fungsi printArray:
o Digunakan untuk mencetak elemen array ke layar.
4. Bagian main:
o Mendefinisikan array yang akan diurutkan dan mencetaknya sebelum
dan sesudah pengurutan dengan Merge Sort.
Output Program:
23
// Tukar arr[i] dan arr[j]
arr[i] = arr[j];
arr[j] = temp;
arr[i + 1] = arr[high];
arr[high] = temp;
quickSort(arr, pi + 1, high);
24
for (int i = 0; i < n; i++) {
printf("\n");
int main() {
printArray(arr, n);
quickSort(arr, 0, n - 1);
printArray(arr, n);
return 0;
Penjelasan Program:
1. Fungsi partition:
o Fungsi ini memilih elemen terakhir (pivot) dan memindahkan elemen-
elemen yang lebih kecil dari pivot ke kiri dan yang lebih besar ke
kanan. Setelah itu, pivot ditempatkan pada posisi yang benar.
o Fungsi ini mengembalikan indeks pivot yang tepat.
2. Fungsi quickSort:
o Fungsi rekursif ini membagi array menjadi dua bagian berdasarkan
posisi pivot yang dikembalikan oleh partition.
25
o Kemudian, fungsi ini memanggil dirinya sendiri untuk mengurutkan
dua bagian tersebut secara terpisah.
3. Fungsi printArray:
o Digunakan untuk mencetak elemen array ke layar.
4. Bagian main:
o Mendefinisikan array yang akan diurutkan dan mencetaknya sebelum
dan sesudah pengurutan dengan Quick Sort.
Output Program:
1. Bubble Sort
Kompleksitas Waktu:
o Kasus Terburuk (Worst case): O(n2)O(n^2)O(n2)
o Kasus Rata-rata (Average case): O(n2)O(n^2)O(n2)
o Kasus Terbaik (Best case): O(n)O(n)O(n) (Jika array sudah terurut)
Kompleksitas Ruang:
o O(1)O(1)O(1) (in-place sorting, hanya membutuhkan sedikit ruang
tambahan)
Kelebihan:
o Mudah diimplementasikan.
26
o Menyortir array yang sudah terurut dengan cepat.
Kekurangan:
o Tidak efisien untuk dataset besar.
o Kompleksitas waktu O(n2)O(n^2)O(n2) di kasus rata-rata dan
terburuk membuatnya lambat pada array besar.
2. Selection Sort
Kompleksitas Waktu:
o Kasus Terburuk (Worst case): O(n2)O(n^2)O(n2)
o Kasus Rata-rata (Average case): O(n2)O(n^2)O(n2)
o Kasus Terbaik (Best case): O(n2)O(n^2)O(n2) (Karena selalu
melakukan perbandingan)
Kompleksitas Ruang:
o O(1)O(1)O(1) (in-place sorting, hanya membutuhkan sedikit ruang
tambahan)
Kelebihan:
o Mudah diimplementasikan.
o Tidak memerlukan ruang tambahan selain untuk variabel sementara.
o Lebih sedikit pertukaran elemen dibandingkan Bubble Sort.
Kekurangan:
o Tidak efisien untuk dataset besar karena kompleksitas waktu
O(n2)O(n^2)O(n2) di semua kasus.
o Tidak stabil (dua elemen dengan nilai yang sama mungkin bertukar
tempat).
3. Insertion Sort
27
Kompleksitas Waktu:
o Kasus Terburuk (Worst case): O(n2)O(n^2)O(n2)
o Kasus Rata-rata (Average case): O(n2)O(n^2)O(n2)
o Kasus Terbaik (Best case): O(n)O(n)O(n) (Jika array sudah terurut)
Kompleksitas Ruang:
o O(1)O(1)O(1) (in-place sorting, hanya membutuhkan sedikit ruang
tambahan)
Kelebihan:
o Sangat efisien pada array yang hampir terurut.
o Stabil (elemen dengan nilai yang sama tetap dalam urutan yang sama).
o Menggunakan sedikit ruang tambahan.
Kekurangan:
o Kompleksitas waktu O(n2)O(n^2)O(n2) pada kasus rata-rata dan
terburuk, membuatnya tidak efisien pada dataset besar.
4. Merge Sort
Kompleksitas Waktu:
o Kasus Terburuk (Worst case): O(nlogn)O(n \log n)O(nlogn)
o Kasus Rata-rata (Average case): O(nlogn)O(n \log n)O(nlogn)
o Kasus Terbaik (Best case): O(nlogn)O(n \log n)O(nlogn)
Kompleksitas Ruang:
o O(n)O(n)O(n) (memerlukan ruang tambahan untuk array sementara)
Kelebihan:
o Stabil (mempertahankan urutan relatif elemen yang sama).
o Efisien untuk dataset besar dengan kompleksitas waktu yang konsisten
O(nlogn)O(n \log n)O(nlogn).
28
o Memiliki performa yang baik pada dataset besar atau ketika
menggunakan data yang tidak dapat dimuat seluruhnya di memori.
Kekurangan:
o Membutuhkan ruang tambahan O(n)O(n)O(n), yang membuatnya
kurang efisien dalam penggunaan memori.
o Tidak secepat Quick Sort untuk dataset kecil.
5. Quick Sort
Kompleksitas Waktu:
o Kasus Terburuk (Worst case): O(n2)O(n^2)O(n2) (Jika pivot yang
dipilih buruk)
o Kasus Rata-rata (Average case): O(nlogn)O(n \log n)O(nlogn)
o Kasus Terbaik (Best case): O(nlogn)O(n \log n)O(nlogn)
Kompleksitas Ruang:
o O(logn)O(\log n)O(logn) (in-place sorting, hanya membutuhkan ruang
tambahan untuk rekursi)
Kelebihan:
o Sangat efisien pada dataset besar dengan kompleksitas waktu
O(nlogn)O(n \log n)O(nlogn) di kasus rata-rata.
o In-place sorting, hanya memerlukan ruang tambahan untuk rekursi.
o Salah satu algoritma sorting tercepat dalam praktik.
Kekurangan:
o Kompleksitas waktu O(n2)O(n^2)O(n2) di kasus terburuk jika pivot
yang dipilih tidak baik (misalnya, jika array sudah terurut).
o Tidak stabil (elemen dengan nilai yang sama dapat berubah posisi
relatifnya).
Kesimpulan:
29
Bubble Sort, Selection Sort, dan Insertion Sort lebih cocok digunakan
untuk dataset kecil atau ketika kesederhanaan algoritma menjadi prioritas.
Merge Sort dan Quick Sort lebih efisien untuk dataset besar, dengan Merge
Sort yang stabil dan Quick Sort yang cepat dalam praktik meskipun dengan
kemungkinan kasus terburuk.
BAB IV
if (arr[i] == key) {
30
return i; // Kembalikan indeks elemen yang ditemukan
printf("\n");
int main() {
printf("Array: \n");
printArray(arr, n);
if (result != -1) {
} else {
31
return 0;
Penjelasan Program:
1. Fungsi linearSearch:
o Fungsi ini menerima array arr[], panjang array n, dan nilai yang ingin
dicari (key).
o Fungsi ini kemudian memeriksa setiap elemen dalam array untuk
mencari elemen yang cocok dengan key.
o Jika ditemukan, fungsi akan mengembalikan indeks elemen tersebut.
Jika tidak ditemukan, fungsi mengembalikan -1.
2. Fungsi printArray:
o Digunakan untuk mencetak elemen-elemen array ke layar.
3. Bagian main:
o Mendefinisikan array yang akan dicari dan nilai key yang akan dicari
dalam array.
o Memanggil fungsi linearSearch untuk mencari elemen dan mencetak
hasilnya.
Output Program:
Array:
64 25 12 22 11
32
1. Tentukan indeks tengah dari array.
2. Bandingkan elemen tengah dengan elemen yang dicari.
o Jika elemen tengah sama dengan elemen yang dicari, pencarian selesai
dan kembalikan indeksnya.
o Jika elemen tengah lebih besar dari elemen yang dicari, periksa bagian
kiri dari array (kurangi indeks bagian kanan).
o Jika elemen tengah lebih kecil dari elemen yang dicari, periksa bagian
kanan dari array (tingkatkan indeks bagian kiri).
3. Ulangi langkah ini dengan membagi array menjadi dua bagian hingga elemen
ditemukan atau array tidak memiliki elemen yang tersisa.
Implementasi Binary Search dalam C
#include <stdio.h>
if (arr[mid] == key) {
return mid;
high = mid - 1;
else {
33
low = mid + 1;
printf("\n");
int main() {
int arr[] = {11, 12, 22, 25, 64}; // Array yang sudah terurut
printf("Array: \n");
printArray(arr, n);
if (result != -1) {
} else {
34
return 0;
Penjelasan Program:
1. Fungsi binarySearch:
o Fungsi ini menerima array arr[], indeks kiri (low), indeks kanan
(high), dan elemen yang ingin dicari (key).
o Algoritma ini membagi array menjadi dua bagian pada setiap iterasi
dengan menghitung indeks tengah (mid), dan membandingkan nilai di
tengah dengan nilai yang dicari.
o Jika ditemukan, fungsi mengembalikan indeks elemen tersebut. Jika
tidak, pencarian dilanjutkan di bagian kiri atau kanan array sesuai
kondisi.
2. Fungsi printArray:
o Fungsi ini digunakan untuk mencetak elemen-elemen array ke layar.
3. Bagian main:
o Array yang sudah terurut didefinisikan, dan elemen yang dicari (key)
diberikan nilai.
o Fungsi binarySearch dipanggil untuk mencari elemen dan mencetak
hasilnya.
Output Program:
Array:
11 12 22 25 64
35
4.3 IMPLEMENTASI PADA DATA ARRAY
Untuk lebih jelasnya, berikut ini adalah implementasi Binary Search pada array
yang berisi data angka. Program ini akan mencari elemen tertentu dalam array yang
sudah terurut dan menampilkan hasil pencarian.
Contoh Program Binary Search pada Data Array
Misalkan kita ingin mencari angka tertentu di dalam array berikut: {11, 12, 22, 25,
64, 70, 88, 99}. Kita akan mencari angka 22 dalam array ini menggunakan Binary
Search.
#include <stdio.h>
if (arr[mid] == key) {
return mid;
high = mid - 1;
else {
low = mid + 1;
36
return -1; // Elemen tidak ditemukan
printf("\n");
int main() {
int arr[] = {11, 12, 22, 25, 64, 70, 88, 99};
// Mencetak array
printf("Array: \n");
printArray(arr, n);
if (result != -1) {
} else {
37
}
return 0;
Penjelasan Program:
1. Array yang Terurut:
2. Dalam program ini, kita menggunakan array yang sudah terurut: {11, 12, 22,
25, 64, 70, 88, 99}.
3. Fungsi binarySearch:
o Menerima array arr[], indeks kiri (low), indeks kanan (high), dan
elemen yang ingin dicari (key).
o Fungsi ini bekerja dengan cara membagi array menjadi dua bagian
pada setiap langkah pencarian. Elemen tengah dibandingkan dengan
elemen yang dicari, dan berdasarkan perbandingan tersebut, bagian
kiri atau kanan array akan dipilih untuk pencarian berikutnya.
4. Fungsi printArray:
o Fungsi ini digunakan untuk mencetak seluruh elemen array.
5. Bagian main:
o Array didefinisikan, dan elemen yang dicari (key = 22) ditentukan.
o Fungsi binarySearch dipanggil untuk mencari elemen dalam array dan
hasilnya dicetak ke layar.
Output Program:
Array:
11 12 22 25 64 70 88 99
38
4.4 STUDI KASUS DAN ANALISIS EFISIENSI
Dalam dunia pemrograman dan ilmu komputer, Binary Search adalah salah satu
algoritma pencarian yang paling efisien untuk mencari elemen dalam array yang
sudah terurut. Untuk memahami efisiensi Binary Search, kita akan melihat studi
kasus dan analisisnya dalam konteks waktu eksekusi dan penggunaan sumber daya.
39
Perbandingan dengan Linear Search:
Jika kita menggunakan Linear Search untuk mencari ID = 500,000 dalam
array yang berisi 1 juta elemen, kita perlu memeriksa setiap elemen satu per satu,
mulai dari indeks 0 hingga 499999.
Waktu untuk Linear Search: O(n), dimana n adalah jumlah elemen dalam
array. Dalam kasus ini, pencarian akan membutuhkan hingga 500,000
perbandingan.
Waktu untuk Binary Search: O(log n), dimana n adalah jumlah elemen
dalam array. Dalam kasus ini, hanya dibutuhkan sekitar 20 perbandingan
(log₂(1,000,000) ≈ 20).
Analisis Efisiensi Binary Search
1. Kompleksitas Waktu (Time Complexity):
Waktu Terburuk (Worst Case):
Binary Search bekerja dengan membagi array menjadi dua bagian pada setiap
langkah. Oleh karena itu, jumlah langkah pencarian yang diperlukan untuk
menemukan elemen atau menentukan bahwa elemen tidak ada adalah sekitar
log2n\log_2 nlog2n, di mana n adalah ukuran array.
Jadi, kompleksitas waktu Binary Search adalah O(logn)O(\log n)O(logn).
Misalnya, untuk array berukuran 1 juta elemen:
o Binary Search akan membutuhkan sekitar 20 langkah (log₂ 1,000,000
≈ 20).
2. Kompleksitas Waktu Rata-rata (Average Case):
Karena Binary Search membagi array menjadi dua bagian setiap kali, waktu
yang dibutuhkan untuk pencarian tidak tergantung pada posisi elemen yang
dicari, sehingga kompleksitas waktu rata-rata juga adalah O(logn)O(\log
n)O(logn).
3. Kompleksitas Ruang (Space Complexity):
Kompleksitas Ruang:
40
Binary Search hanya memerlukan beberapa variabel tambahan untuk melacak
indeks kiri (low), kanan (high), dan tengah (mid), sehingga kompleksitas
ruangnya adalah O(1) (konstan).
4. Efisiensi pada Data Besar:
Jika kita memiliki data yang sangat besar (misalnya miliaran elemen), Binary
Search masih akan bekerja dengan sangat cepat. Sebagai contoh:
o Untuk array dengan 1 juta elemen, Binary Search hanya membutuhkan
sekitar 20 langkah.
o Untuk array dengan 1 miliar elemen, Binary Search hanya
membutuhkan sekitar 30 langkah.
Di sisi lain, Linear Search akan memerlukan waktu yang sangat lama pada data
besar karena kompleksitasnya adalah O(n)O(n)O(n).
Kesimpulan:
Binary Search sangat efisien pada array yang terurut, dengan kompleksitas
waktu O(logn)O(\log n)O(logn), yang membuatnya ideal untuk pencarian
cepat dalam dataset besar.
Linear Search, meskipun mudah diimplementasikan, tidak efisien untuk
dataset besar karena kompleksitasnya adalah O(n)O(n)O(n).
Pada aplikasi dunia nyata yang mengelola data besar (seperti pencarian ID
pengguna atau data produk), Binary Search memberikan keunggulan yang
signifikan dalam hal kecepatan pencarian dibandingkan dengan algoritma
pencarian lainnya.
41
Dengan demikian, jika data Anda sudah terurut, menggunakan Binary Search
adalah pilihan yang lebih efisien dibandingkan dengan pencarian linier, terutama pada
dataset besar.
BAB VI
42
sangat cepat. Ini berbeda dengan Linear Search yang akan memakan
waktu lebih lama seiring dengan bertambahnya jumlah elemen.
4. Kompleksitas Ruang:
o Binary Search sangat hemat dalam penggunaan ruang, dengan
kompleksitas ruang O(1)O(1)O(1), karena hanya membutuhkan
beberapa variabel untuk menyimpan indeks yang diperlukan dalam
pencarian.
6.2 SARAN
Berdasarkan hasil studi dan analisis yang telah dilakukan mengenai Binary
Search, berikut adalah beberapa saran untuk pengembangan dan implementasi lebih
lanjut:
1. Penggunaan Binary Search pada Data Terurut:
o Pastikan data yang digunakan dalam pencarian sudah terurut. Jika data
tidak terurut, lebih baik untuk mengurutkannya terlebih dahulu
menggunakan algoritma pengurutan yang efisien, seperti Merge Sort
atau Quick Sort, sebelum melakukan Binary Search.
o Jika data sering diperbarui (seperti data dinamis), pertimbangkan
untuk menggunakan struktur data seperti Self-Balancing Binary
Search Trees (seperti AVL Trees atau Red-Black Trees) untuk
menjaga data tetap terurut dan memungkinkan pencarian yang cepat
tanpa harus mengurutkan ulang seluruh array.
43
2. Memperhatikan Efisiensi Pengurutan:
o Jika dataset Anda terus berkembang dan pengurutan menjadi
bottleneck, pertimbangkan untuk menggunakan algoritma pengurutan
yang lebih efisien dalam konteks waktu dan ruang, seperti Quick Sort
(untuk waktu terbaik) atau Merge Sort (untuk stabilitas dan
kompleksitas waktu yang konsisten).
3. Penggunaan Binary Search pada Data yang Sangat Besar:
o Pada dataset yang sangat besar, misalnya yang disimpan di database
atau dalam sistem distribusi, pertimbangkan untuk memanfaatkan
algoritma pencarian terdistribusi yang serupa dengan Binary Search,
atau gunakan teknik pencarian berbasis indeks untuk meningkatkan
efisiensi pencarian di luar memori lokal.
4. Implementasi dalam Aplikasi Dunia Nyata:
o Dalam aplikasi yang membutuhkan pencarian cepat, seperti aplikasi e-
commerce atau basis data, menggunakan Binary Search untuk
pencarian produk atau data yang terurut dapat sangat meningkatkan
kinerja.
o Selain itu, pertimbangkan untuk mengimplementasikan Caching pada
sistem pencarian untuk data yang sering dicari, guna mengurangi
waktu akses dan meningkatkan pengalaman pengguna.
5. Pemahaman tentang Kompleksitas:
o Penting untuk memahami batasan dan kompleksitas waktu serta ruang
dalam menggunakan Binary Search. Sementara Binary Search
sangat efisien, pengurutan data yang membutuhkan waktu
O(nlogn)O(n \log n)O(nlogn) pada awalnya bisa menjadi hambatan
jika data sering berubah.
o Selalu pertimbangkan karakteristik data dan kebutuhan aplikasi saat
memilih algoritma pencarian. Untuk data yang sering berubah,
algoritma pencarian lain yang lebih fleksibel bisa jadi lebih tepat,
meskipun sedikit lebih lambat, seperti Linear Search atau pencarian
menggunakan hash table.
Dengan mengimplementasikan saran-saran ini, kita dapat lebih memaksimalkan
keefisienan Binary Search dalam berbagai situasi dan kondisi data, serta
meningkatkan kinerja dan responsivitas aplikasi yang mengandalkan pencarian data.
44
6.3 DAFTAR PUSTAKA
Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to Algorithms
(3rd ed.). The MIT Press.
Knuth, D. E. (1998). The Art of Computer Programming, Volume 3: Sorting and Searching
(2nd ed.). Addison-Wesley.
Weiss, M. A. (2013). Data Structures and Algorithm Analysis in C (4th ed.). Pearson
Education.
Baase, S., & Van Gutt, A. (2016). Computer Algorithms: Introduction to Design and
Analysis (3rd ed.). Pearson.
45