Materi Berpikir Komputasional

Materi pelajaran.
Tujuan Pembelajaran

Setelah mempelajari bab ini, Anda akan mampu:
  1. memahami teknik-teknik pencarian sekuensial;
  2. mengimplementasikan pencarian beruntun dengan medode sentinel;
  3. menjelaskan algoritma coding; serta
  4. menganalisis tumpukan dan antrean pada data.
Dimensi Profil Pelajar Pancasila
  • Bernalar kritis
  • Mandiri
Berpikir komputasional untuk tingkat SMA (Sekolah Menengah Atas) dalam mata pelajaran Informatika merupakan pemecahan terhadap persoalan-persoalan mendasar dalam kehidupan sehari-hari yang perlu dikuasai. Terdapat empat fondasi berpikir komputasional dalam ilmu Informatika, yaitu decomposition, pattern recognition, abstraction, dan algorithms. Hal tersebut dilakukan dengan memusatkan penyelesaian berbagai persoalan dari satu sudut pandang yang merupakan salah satu metode dalam berpikir kritis. Bagaimana cara berpikir komputasional untuk tingkat SMA? Anda dapat mempelajarinya pada bab ini. Selain itu, Anda juga akan belajar bagaimana cara melakukan pencarian data? Bagaimana cara melakukan pengurutan data? Apa itu tumpukan dan antrean data? Untuk dapat memahaminya, mari pelajari bab ini dengan sungguh-sungguh.

Daftar Isi:

A. Pencarian (Searching)
- Pencarian Sekuensial
- Pencarian Beruntun dengan Sentinel
- Pencarian Biner
- Pencarian Interpolasi

B. Sorting
 
Pernahkah Anda mencari tahu tentang berpikir komputasional?

Berpikir komputasional (computational thinking) adalah pendekatan sistematis dalam menyelesaikan masalah dengan menerapkan prinsip-prinsip ilmu komputer atau informatika. Pendekatan ini melibatkan berbagai keterampilan seperti pemecahan masalah, logika, abstraksi, dan pengembangan algoritma. Tantangan bebas yang diberikan dalam pembelajaran dirancang untuk mendorong siswa berpikir kreatif dan kritis, serta menerapkan konsep berpikir komputasional dalam menyelesaikan berbagai permasalahan.

Zaman terus berkembang, begitu pula dengan teknologi yang semakin canggih dari waktu ke waktu. Perkembangan ini membuat berbagai aspek kehidupan—mulai dari komunikasi, transportasi, hingga pendidikan—berjalan lebih cepat dan efisien. Untuk bisa tetap relevan, kita dituntut untuk mampu mengikuti dinamika zaman dan kemajuan teknologi. Jika tidak, kita berisiko tertinggal.

Kata Kunci:
  • Berpikir
  • Pencarian
  • Algoritma
  • Metode
  • Search
berpikir komputasional


Perhatikan gambar apersepsi di atas. Setelah mengamati gambar tersebut, coba jawab pertanyaan-pertanyaan berikut:
  1. Apa yang dapat Anda pahami dari gambar tentang berpikir komputasional tersebut?
  2. Apakah gambar tersebut mencerminkan proses pencarian informasi Anda mengenai berpikir komputasional?
  3. Pernahkah Anda menyelesaikan suatu masalah dengan menerapkan cara berpikir komputasional?
  4. Apa hasil yang Anda peroleh? Jelaskan secara singkat!
 

A. Pencarian (Searching)​


Pencarian (searching) adalah proses menemukan suatu nilai (data) tertentu di dalam kumpulan data yang bertipe sama. Proses ini merupakan bagian fundamental dalam pemrograman dan struktur data, terutama dalam sistem informasi, database, dan aplikasi berbasis data.

1. Pengertian Pencarian

Pencarian dilakukan untuk menemukan keberadaan suatu data dalam sekumpulan data. Jika data ditemukan, operasi seperti pembacaan, pengubahan (update), atau penghapusan dapat dilakukan. Jika data tidak ditemukan, maka dapat dilakukan penambahan (insert), asalkan tidak terjadi duplikasi.

Data dapat disimpan:
  • Temporer di memori utama (RAM), biasanya dalam bentuk larik (array).
  • Permanen di memori sekunder (hard disk), biasanya dalam bentuk file (arsip).
Efisiensi pencarian sangat dipengaruhi oleh:
  • Jumlah data
  • Keadaan data (terurut atau tidak)
  • Struktur penyimpanan data
  • Algoritma pencarian yang digunakan
2. Jenis-Jenis Algoritma Pencarian

Berdasarkan keadaan data, algoritma pencarian dikategorikan menjadi:
  1. Pencarian Sekuensial (Sequential Search)
  2. Pencarian Biner (Binary Search)
  3. Pencarian Interpolasi (Interpolation Search)

1. Pencarian Sekuensial (Sequential Search)​


a. Pengertian

Pencarian sekuensial (juga dikenal sebagai linear search) adalah metode pencarian paling sederhana. Data diperiksa satu per satu secara berurutan dari awal hingga akhir, hingga data yang dicari ditemukan atau seluruh data telah diperiksa.

b. Karakteristik
  • Cocok untuk data tidak terurut
  • Kompleksitas waktu: O(n) (kasus terburuk)
  • Tidak memerlukan data terurut
  • Mudah diimplementasikan
c. Macam-Macam Pencarian Beruntun
  1. Pada larik tidak terurut
  2. Pada larik terurut (bisa lebih efisien karena pencarian bisa dihentikan lebih awal jika data sudah melewati nilai target)
d. Algoritma Pencarian Sekuensial
Code:
1. i ← 0
2. ketemu ← false
3. Selama (i < N) dan (tidak ketemu) lakukan:
   a. Jika Data[i] = x maka ketemu ← true
   b. Jika tidak, i ← i + 1
4. Jika ketemu, maka data ditemukan pada indeks i
   Jika tidak, data tidak ditemukan

e. Contoh Program (C++)
C++:
#include <iostream>
using namespace std;

int main() {
    int data[8] = {8, 10, 6, -2, 11, 7, 1, 100};
    int cari;
    bool ketemu = false;

    cout << "Masukkan data yang ingin dicari: ";
    cin >> cari;

    for (int i = 0; i < 8; i++) {
        if (data[i] == cari) {
            ketemu = true;
            cout << "Data ditemukan pada indeks ke-" << i << endl;
            break;
        }
    }

    if (!ketemu) {
        cout << "Data tidak ditemukan!" << endl;
    }

    return 0;
}

2. Pencarian Beruntun dengan Sentinel (Sequential Search with Sentinel)​


a. Pengertian

Sentinel adalah nilai dummy yang ditempatkan di akhir larik untuk menghindari pemeriksaan batas array secara eksplisit, sehingga mempercepat pencarian.

b. Keuntungan
  • Mengurangi jumlah operasi perbandingan
  • Meningkatkan efisiensi sedikit pada data besar
c. Prinsip Kerja
  • Nilai yang dicari (x) disalin ke posisi akhir array (indeks n)
  • Pencarian dilakukan tanpa mengecek batas array
  • Jika data ditemukan:
    • Jika di posisi n, berarti data tidak ada dalam data asli
    • Jika di posisi < n, berarti data ada
d. Algoritma
Code:
Procedure SeqSearchWithSentinel(input L: Larik, input n: integer, input x: integer, output idx: integer)
DEKLARASI:
    i: integer
ALGORITMA:
    L[n] ← x          // Letakkan sentinel
    i ← 0
    while L[i] ≠ x do
        i ← i + 1
    endwhile
    if i == n then
        idx ← -1      // Tidak ditemukan
    else
        idx ← i       // Ditemukan pada indeks i

e. Contoh Implementasi (C++)
C++:
#include <iostream>
using namespace std;

int seqSearchWithSentinel(int arr[], int n, int x) {
    arr[n] = x;  // Sentinel
    int i = 0;
    while (arr[i] != x) {
        i++;
    }
    return (i == n) ? -1 : i;
}

int main() {
    int data[9];  // +1 untuk sentinel
    int n = 8;
    int cari;

    // Isi data
    int temp[8] = {8, 10, 6, -2, 11, 7, 1, 100};
    for (int i = 0; i < n; i++) {
        data[i] = temp[i];
    }

    cout << "Masukkan data yang dicari: ";
    cin >> cari;

    int idx = seqSearchWithSentinel(data, n, cari);
    if (idx == -1) {
        cout << "Data tidak ditemukan." << endl;
    } else {
        cout << "Data ditemukan pada indeks ke-" << idx << endl;
    }

    return 0;
}

3. Pencarian Biner (Binary Search)​


a. Pengertian

Pencarian biner (binary search) adalah metode pencarian yang efisien untuk data yang sudah terurut. Prinsipnya adalah membagi data menjadi dua bagian dan mencari pada bagian yang mungkin mengandung data.

b. Karakteristik
  • Hanya bekerja pada data terurut
  • Kompleksitas waktu: O(log n)
  • Jauh lebih cepat daripada pencarian sekuensial untuk data besar
c. Prinsip Kerja
  • Tentukan batas kiri (L) dan kanan (R)
  • Hitung indeks tengah: mid = (L + R) / 2
  • Bandingkan data tengah dengan data yang dicari:
    • Jika sama → data ditemukan
    • Jika lebih kecil → cari di subarray kanan (L = mid + 1)
    • Jika lebih besar → cari di subarray kiri (R = mid - 1)
    • Ulangi hingga data ditemukan atau L > R
d. Algoritma
Code:
1. L ← 0
2. R ← N - 1
3. Ketemu ← false
4. Selama (L <= R) dan (tidak ketemu):
   a. mid ← (L + R) / 2
   b. Jika Data[mid] = x → ketemu ← true
   c. Jika x < Data[mid] → R ← mid - 1
   d. Jika x > Data[mid] → L ← mid + 1
5. Jika ketemu → data ditemukan di indeks mid
   Jika tidak → data tidak ditemukan

e. Contoh Program (C++)
C++:
#include <iostream>
using namespace std;

int binarySearch(int arr[], int L, int R, int x) {
    while (L <= R) {
        int mid = L + (R - L) / 2;  // Hindari overflow
        if (arr[mid] == x) {
            return mid;
        } else if (x < arr[mid]) {
            R = mid - 1;
        } else {
            L = mid + 1;
        }
    }
    return -1;  // Tidak ditemukan
}

int main() {
    int data[] = {-2, 1, 6, 7, 8, 10, 11, 100};  // Harus terurut
    int n = 8;
    int cari;

    cout << "Masukkan data yang dicari: ";
    cin >> cari;

    int idx = binarySearch(data, 0, n - 1, cari);
    if (idx == -1) {
        cout << "Data tidak ditemukan." << endl;
    } else {
        cout << "Data ditemukan pada indeks ke-" << idx << endl;
    }

    return 0;
}
Catatan: Data harus diurutkan terlebih dahulu sebelum menggunakan binary search.

4. Pencarian Interpolasi (Interpolation Search)​


a. Pengertian

Interpolation search adalah variasi dari binary search yang menggunakan perkiraan posisi data berdasarkan nilai kunci. Cocok untuk data terurut dengan distribusi yang merata.

b. Prinsip Kerja

Posisi perkiraan dihitung dengan rumus:
rumus interpolation search

  • Jika nilai di posisi pos lebih besar dari x, cari di subarray kiri
  • Jika lebih kecil, cari di subarray kanan
  • Jika sama, data ditemukan
c. Keuntungan

Lebih cepat dari binary search jika data terdistribusi merata
Kompleksitas rata-rata: O(log log n)

d. Contoh Ilustrasi

KodeJudul BukuPengarang
025The C++ ProgrammingJames Wood
034Mastering Delphi 6Marcopolo
041Professional C#Simon Webe
056Pure JavaScript v2Michael Blton
063Advanced JSP & ServletDavid Dunn
072Calculus Make it EasyGunner Christian
088Visual Basic 2005 ExpressAntonie
096Artificial Life : Volume 1Gloria Virgini

Cari kode 088:
  • low = 0, high = 7
  • pos = 0 + ((088 - 025) / (096 - 025)) × (7 - 0) = 6
  • arr[6] = 088 → ditemukan
Cari kode 060:
  • pos = 0 + ((60 - 25) / (96 - 25)) × 7 ≈ 3.46 → dibulatkan ke 3
  • arr[3] = 056 < 060 → low = 4
  • pos baru = 4 + ((60 - 63) / (96 - 63)) × (7 - 4) → tidak valid (60 < 63)
  • Karena 063 > 060 dan tidak ada nilai di antaranya → tidak ditemukan
e. Contoh Program (C++)
C++:
#include <iostream>
using namespace std;

int interpolationSearch(int arr[], int low, int high, int x) {
    while (low <= high && x >= arr[low] && x <= arr[high]) {
        if (low == high) {
            if (arr[low] == x) return low;
            return -1;
        }

        int pos = low + ((double)(x - arr[low]) / (arr[high] - arr[low])) * (high - low);

        if (arr[pos] == x) {
            return pos;
        }
        if (arr[pos] < x) {
            low = pos + 1;
        } else {
            high = pos - 1;
        }
    }
    return -1;
}

int main() {
    int arr[] = {25, 34, 41, 56, 63, 72, 88, 96};
    int n = 8;
    int val;

    cout << "Masukkan kode buku yang dicari: ";
    cin >> val;

    int pos = interpolationSearch(arr, 0, n - 1, val);
    if (pos == -1) {
        cout << "Data tidak ditemukan." << endl;
    } else {
        cout << "Data ditemukan pada indeks ke-" << pos << endl;
    }

    return 0;
}
Catatan: Gunakan casting double untuk menghindari pembagian integer.



Kesimpulan

Metode PencarianKondisi DataKompleksitas (Worst)Catatan
Sequential SearchTerurut / AcakO(n)Sederhana, cocok untuk data kecil
Sequential + SentinelTerurut / AcakO(n)Sedikit lebih efisien
Binary SearchHarus terurutO(log n)Cepat untuk data besar
Interpolation SearchTerurut, distribusi merataO(log log n)Sangat cepat jika data merata
 

B. Pengurutan (Sorting)​


Pengurutan (sorting) adalah proses menyusun kembali sejumlah data berdasarkan nilai tertentu agar teratur menaik (ascending) atau menurun (descending). Proses ini sangat penting dalam pemrograman karena data yang terurut mempermudah operasi seperti pencarian (searching), analisis data, dan penyajian informasi.

Jenis-Jenis Algoritma Sorting

Berdasarkan cara kerjanya, algoritma pengurutan diklasifikasikan menjadi dua kelompok utama:

JenisDeskripsiContoh Algoritma
Comparison SortMengurutkan data dengan membandingkan elemen satu sama lainBubble Sort, Selection Sort, Insertion Sort, Merge Sort, Quick Sort
Non-Comparison SortMengurutkan tanpa perbandingan langsung antar elemenCounting Sort, Radix Sort, Bucket Sort
Catatan: Pada materi ini, fokus dibatasi pada algoritma comparison sort yang umum digunakan dalam pemrograman dasar.

1. Selection Sort​


a. Pengertian

Selection Sort adalah algoritma pengurutan yang bekerja dengan memilih elemen terkecil (untuk ascending) atau terbesar (untuk descending) dari data yang belum terurut, lalu menukarnya dengan elemen pertama dari bagian yang belum terurut.

b. Prinsip Kerja
  1. Cari elemen terkecil dari indeks ke-i hingga akhir.
  2. Tukar elemen tersebut dengan elemen pada indeks ke-i.
  3. Pindahkan batas awal bagian yang belum terurut (i++).
  4. Ulangi hingga seluruh data terurut.
c. Karakteristik
  • Kompleksitas waktu: O(n²) — untuk semua kasus (terbaik, rata-rata, terburuk)
  • Kompleksitas ruang: O(1) — in-place
  • Stabilitas: Tidak stabil (urutan relatif elemen sama bisa berubah)
  • Sederhana, tetapi tidak efisien untuk data besar
d. Selection Sort Ascending

Contoh:
Data awal: [29, 10, 14, 37, 13]
LangkahAksiHasil
1Cari min (10), tukar dengan 29[10, 29, 14, 37, 13]
2Cari min dari sisa (13), tukar dengan 29[10, 13, 14, 37, 29]
3Cari min (14), sudah di tempat[10, 13, 14, 37, 29]
4Cari min (29), tukar dengan 37[10, 13, 14, 29, 37]

Selesai setelah n-1 langkah.

e. Selection Sort Descending

Prinsip:
Cari elemen terbesar dari bagian yang belum terurut, lalu tukar dengan elemen pertama dari bagian tersebut.

Contoh:
Data awal: [29, 10, 14, 37, 13]

LangkahAksiHasil
1Cari max (37), tukar dengan 29[37, 10, 14, 29, 13]
2Cari max dari sisa (29), tukar dengan 10[37, 29, 14, 10, 13]
3Cari max (14), tukar dengan 14[37, 29, 14, 10, 13]
4Cari max (13), tukar dengan 10[37, 29, 14, 13, 10]

f. Algoritma (Pseudocode)

Code:
for i ← 0 to n-2 do
    min_idx ← i
    for j ← i+1 to n-1 do
        if arr[j] < arr[min_idx] then
            min_idx ← j
    tukar arr[i] dengan arr[min_idx]

g. Contoh Program (C++)

C++:
#include <iostream>
using namespace std;

void selectionSort(int arr[], int n, bool ascending = true) {
    for (int i = 0; i < n - 1; i++) {
        int idx = i;
        for (int j = i + 1; j < n; j++) {
            if (ascending) {
                if (arr[j] < arr[idx]) idx = j;
            } else {
                if (arr[j] > arr[idx]) idx = j;
            }
        }
        swap(arr[i], arr[idx]);
    }
}

int main() {
    int data[] = {29, 10, 14, 37, 13};
    int n = 5;

    cout << "Sebelum diurutkan: ";
    for (int i = 0; i < n; i++) cout << data[i] << " ";

    selectionSort(data, n, true);  // ascending

    cout << "\nSetelah ascending: ";
    for (int i = 0; i < n; i++) cout << data[i] << " ";

    return 0;
}


2. Bubble Sort​


a. Pengertian

Bubble Sort adalah algoritma pengurutan yang bekerja dengan terus membandingkan dua elemen bersebelahan dan menukarnya jika urutannya salah. Proses ini diulang hingga tidak ada lagi pertukaran yang terjadi.

Nama "bubble" berasal dari analogi bahwa elemen yang lebih kecil "mengapung" ke depan seperti gelembung udara.

b. Prinsip Kerja
  1. Bandingkan elemen ke-i dengan elemen ke-i+1.
  2. Jika urutannya salah (misal: arr > arr[i+1] untuk ascending), tukar.
  3. Lanjutkan hingga akhir array.
  4. Ulangi proses hingga satu iterasi penuh tanpa pertukaran.
c. Karakteristik
  • Kompleksitas waktu: O(n²) — terburuk dan rata-rata; O(n) — terbaik (jika data sudah terurut)
  • Kompleksitas ruang: O(1)
  • Stabil: Ya
  • Sederhana, tapi paling tidak efisien untuk data besar
d. Contoh: Ascending

Data: [5, 1, 4, 2, 8]

Iterasi 1:
  • [5,1,4,2,8] → [1,5,4,2,8]
  • [1,5,4,2,8] → [1,4,5,2,8]
  • [1,4,5,2,8] → [1,4,2,5,8]
  • [1,4,2,5,8] → tetap
  • Hasil: [1,4,2,5,8]
Iterasi 2:
  • [1,4,2,5,8] → [1,2,4,5,8]
  • [1,2,4,5,8] → tetap
  • [1,2,4,5,8] → tetap
  • Hasil: [1,2,4,5,8]
Iterasi 3:
  • Tidak ada pertukaran → selesai
e. Algoritma (Pseudocode)

Code:
for i ← 0 to n-1 do
    swapped ← false
    for j ← 0 to n-i-2 do
        if arr[j] > arr[j+1] then
            tukar arr[j] dan arr[j+1]
            swapped ← true
    if not swapped then break  // Data sudah terurut

f. Contoh Program (C++)

C++:
#include <iostream>
using namespace std;

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        bool swapped = false;
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
                swapped = true;
            }
        }
        if (!swapped) break;  // Optimasi: hentikan jika sudah terurut
    }
}

int main() {
    int data[] = {64, 34, 25, 12, 22, 11, 90};
    int n = 7;

    cout << "Sebelum: ";
    for (int i = 0; i < n; i++) cout << data[i] << " ";

    bubbleSort(data, n);

    cout << "\nSetelah: ";
    for (int i = 0; i < n; i++) cout << data[i] << " ";

    return 0;
}


3. Insertion Sort​


a. Pengertian

Insertion Sort bekerja seperti mengurutkan kartu di tangan. Setiap elemen diambil dari bagian yang belum terurut dan dimasukkan ke posisi yang tepat di bagian yang sudah terurut.

b. Prinsip Kerja
  1. Anggap elemen pertama sudah terurut.
  2. Ambil elemen berikutnya.
  3. Bandingkan dengan elemen di bagian terurut (dari kanan ke kiri).
  4. Geser elemen yang lebih besar ke kanan.
  5. Masukkan elemen pada posisi yang tepat.
  6. Ulangi hingga semua elemen terurut.
c. Karakteristik
  • Kompleksitas waktu: O(n²) — terburuk dan rata-rata; O(n) — terbaik (data hampir terurut)
  • Kompleksitas ruang: O(1)
  • Stabil: Ya
  • Efisien untuk data kecil atau hampir terurut
  • In-place dan online (bisa mengurutkan saat data masuk)
d. Contoh: Ascending

Data: [12, 11, 13, 5, 6]

LangkahAksiHasil
111 < 12 → geser 12, masukkan 11[11, 12, 13, 5, 6]
213 > 12 → tetap[11, 12, 13, 5, 6]
35 < 13, 5 < 12, 5 < 11 → masukkan di depan[5, 11, 12, 13, 6]
46 < 13, 6 < 12, 6 < 11 → masukkan setelah 5[5, 6, 11, 12, 13]

e. Algoritma (Pseudocode)

Code:
for i ← 1 to n-1 do
    key ← arr[i]
    j ← i - 1
    while j >= 0 and arr[j] > key do
        arr[j+1] ← arr[j]
        j ← j - 1
    arr[j+1] ← key

f. Contoh Program (C++)

C++:
#include <iostream>
using namespace std;

void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

int main() {
    int data[] = {12, 11, 13, 5, 6};
    int n = 5;

    cout << "Sebelum: ";
    for (int i = 0; i < n; i++) cout << data[i] << " ";

    insertionSort(data, n);

    cout << "\nSetelah: ";
    for (int i = 0; i < n; i++) cout << data[i] << " ";

    return 0;
}


Perbandingan Algoritma Sorting

AlgoritmaTerbaikRata-rataTerburukRuangStabilKeternagan
Selection SortO(n²)O(n²)O(n²)O(1)❌Sederhana, tidak efisien
Bubble SortO(n)O(n²)O(n²)O(1)✅Mudah dipahami, lambat
Insertion SortO(n)O(n²)O(n²)O(1)✅Baik untuk data kecil/hampir terurut

Kesimpulan
  • Selection Sort: Cocok untuk pemahaman dasar, tetapi tidak efisien.
  • Bubble Sort: Paling mudah dipahami, tetapi paling lambat.
  • Insertion Sort: Paling praktis untuk data kecil atau hampir terurut.
Untuk data besar, gunakan algoritma lanjutan seperti Merge Sort (O(n log n), stabil) atau Quick Sort (O(n log n) rata-rata, cepat, tetapi tidak stabil).
 

Anggota online

Tak ada anggota yang online sekarang.
Back
Top Bottom