edubun
Bahasa Indonesia

Pengurutan 1: bubble sort, selection sort, dan insertion sort

Selection sort selalu melakukan tepat 45 perbandingan pada daftar berisi 10 nilai apa pun, baik daftarnya mula-mula acak maupun sudah terurut.

Menyusun secara berurutan

Mengurutkan berarti menyusun ulang daftar supaya nilainya berurutan dari yang terkecil ke yang terbesar (atau menurut nama, tanggal, harga, urutan apa pun yang bisa dibandingkan). Ini salah satu pekerjaan yang paling sering dilakukan komputer: kontak di ponsel, hasil pencarian yang diurutkan menurut relevansi, kolom spreadsheet yang diurutkan menurut tanggal. Pengurutan juga mempermudah pekerjaan lain. Seperti yang ditunjukkan unit sebelumnya, daftar terurut bisa dicari dengan pencarian biner, dan nilai kembar dalam daftar terurut letaknya bersebelahan.

Unit ini membahas tiga metode sederhana. Ketiganya bekerja dengan membandingkan dua nilai sekaligus dan memindahkan nilai di dalam daftar yang sama. Kodenya pendek dan mudah diikuti, tetapi ketiganya menjadi sangat lambat pada daftar yang panjang. Memahami mengapa ketiganya melambat adalah persiapan terbaik untuk metode yang lebih cepat di unit berikutnya. Sepanjang unit ini kita menghitung dua hal: perbandingan (bertanya "apakah nilai ini lebih besar daripada nilai itu?") dan pertukaran (menukar dua nilai).

Bubble sort: tukar tetangga yang urutannya salah

Bubble sort menyusuri daftar sambil membandingkan setiap pasangan tetangga. Kalau nilai di kiri lebih besar, keduanya ditukar. Setelah satu lintasan penuh, nilai terbesar sudah terbawa selangkah demi selangkah ke ujung kanan, seperti gelembung yang naik, dan nilai itu tidak perlu dipindahkan lagi. Lintasan berikutnya bisa berhenti satu tempat lebih awal. Perbaikan yang umum adalah memperhatikan lintasan yang sama sekali tanpa pertukaran: artinya semua sudah berurutan, jadi pengurutan bisa berhenti lebih awal.

Ikuti langkahnya pada daftar [5, 1, 4, 2, 8]. Lintasan pertama membandingkan 5 dan 1 (tukar), 5 dan 4 (tukar), 5 dan 2 (tukar), 5 dan 8 (biarkan): daftarnya sekarang [1, 4, 2, 5, 8] dan 8 sudah di tempatnya. Lintasan kedua membandingkan 1 dan 4, 4 dan 2 (tukar), 4 dan 5, sehingga menjadi [1, 2, 4, 5, 8]. Lintasan ketiga membandingkan 1 dan 2, lalu 2 dan 4, tidak menukar apa pun, lalu berhenti. Jumlahnya: 4 + 3 + 2 = 9 perbandingan dan 4 pertukaran.

function bubbleSort(a) {
  for (let pass = 0; pass < a.length - 1; pass++) {
    let swapped = false;
    for (let j = 0; j < a.length - 1 - pass; j++) {
      if (a[j] > a[j + 1]) {
        [a[j], a[j + 1]] = [a[j + 1], a[j]];  // tukar
        swapped = true;
      }
    }
    if (!swapped) break;  // sudah terurut
  }
  return a;
}

Selection sort: cari yang terkecil, taruh berikutnya

Selection sort bekerja seperti cara banyak orang mengurutkan kartu di tangan. Telusuri seluruh daftar untuk mencari nilai terkecil, lalu tukar nilai itu ke posisi pertama. Kemudian telusuri sisanya untuk mencari nilai terkecil yang tersisa dan tukar ke posisi kedua, begitu seterusnya. Pada [5, 1, 4, 2, 8] penelusuran pertama menemukan 1 dan menukarnya dengan 5; penelusuran kedua menemukan 2 dan menukarnya dengan 5; dua penelusuran terakhir mendapati 4 dan 5 sudah di tempatnya. Hanya 2 pertukaran, tetapi penelusurannya tetap membandingkan 4 + 3 + 2 + 1 = 10 kali.

Selection sort tidak pernah berhenti lebih awal. Bahkan pada daftar yang sudah terurut, metode ini tetap harus memeriksa setiap nilai yang tersisa untuk memastikan ia mendapat yang terkecil. Untuk n nilai, jumlah perbandingannya selalu (n − 1) + (n − 2) + … + 1 = n(n − 1)/2. Untuk 10 nilai hasilnya 45; untuk 100 nilai, 4950; untuk 1000 nilai, 499 500. Kekuatannya adalah jumlah pertukaran yang sedikit: paling banyak n − 1, dan ini penting kalau memindahkan nilai itu mahal.

Insertion sort: sisipkan setiap nilai baru ke tempatnya

Insertion sort menjaga bagian kiri daftar tetap terurut dan memperbesarnya satu nilai setiap kali. Metode ini mengambil nilai berikutnya dan menggesernya ke kiri, bertukar dengan tetangganya, sampai tetangganya tidak lebih besar. Saat itu nilai tersebut sudah berada di tempatnya di antara nilai-nilai yang terurut. Pada daftar yang hampir terurut, setiap nilai baru hanya bergeser satu atau dua langkah, jadi insertion sort sangat cepat di situ. Pada [5, 1, 4, 2, 8] metode ini melakukan 7 perbandingan dan 4 pertukaran.

Memuat

Seret untuk memutar. Gulir atau cubit untuk memperbesar.

Daftar [5, 1, 4, 2, 8]. Ganti-ganti di antara ketiga metode dan periksa hitungannya dengan angka di unit ini. Lalu pilih Terbalik atau Sudah terurut untuk melihat kasus terbaik dan terburuk.

Menghitung pertukaran: inversi

Ada cara rapi untuk menebak berapa pertukaran yang dibutuhkan bubble sort dan insertion sort. Hitung inversinya: pasangan nilai yang urutannya salah satu sama lain. Dalam [5, 1, 4, 2, 8] inversinya adalah (5, 1), (5, 4), (5, 2), dan (4, 2), semuanya empat. Setiap pertukaran dua tetangga yang urutannya salah memperbaiki tepat satu inversi tanpa membuat inversi baru, jadi kedua metode itu melakukan tepat 4 pertukaran. Daftar terbalik berisi n nilai memiliki semua pasangan terbalik, yaitu n(n − 1)/2 inversi, dan itulah kasus terburuknya.

MetodeContohTerurut (5 nilai)Terbalik (4 nilai)
Bubble sort9 / 44 / 06 / 6
Selection sort10 / 210 / 06 / 2
Insertion sort7 / 44 / 06 / 6

Setiap sel berisi perbandingan / pertukaran. Daftar contohnya [5, 1, 4, 2, 8]. Bubble sort di sini adalah versi yang berhenti setelah satu lintasan tanpa pertukaran.

Ketiga metode punya kelemahan yang sama. Dalam kasus terburuk, masing-masing membandingkan hampir setiap pasangan nilai, sekitar n²/2 perbandingan. Gandakan panjang daftarnya, maka pekerjaannya naik empat kali. Daftar sepuluh kali lebih panjang berarti pekerjaan seratus kali lebih banyak. Untuk beberapa puluh nilai hal itu hampir tidak terasa; untuk sejuta nilai jelas tidak mungkin, dan unit berikutnya menunjukkan cara yang jauh lebih baik.

perbandinganMenanyakan apakah satu nilai lebih besar daripada nilai lain
pertukaran (swap)Menukar posisi dua nilai
lintasan (pass)Satu kali menyusuri daftar
bubble sortTukar tetangga yang urutannya salah; nilai terbesar naik ke ujung di setiap lintasan
selection sortCari nilai terkecil yang tersisa dan tukar ke tempat berikutnya
insertion sortGeser setiap nilai baru ke kiri masuk ke bagian yang terurut
inversiPasangan nilai yang urutannya salah satu sama lain
n(n − 1)/2Banyaknya pasangan di antara n nilai
  1. Berapa perbandingan yang dilakukan selection sort pada daftar berisi 10 nilai apa pun?
  2. Berapa banyak inversi dalam [3, 1, 2]?
  3. Berapa pertukaran yang dilakukan insertion sort pada [4, 3, 2, 1]?
  4. Setelah lintasan pertama bubble sort, nilai mana yang pasti sudah berada di tempat akhirnya?
    • Yang terkecil, di depan
    • Yang terbesar, di ujung
    • Nilai tengah
    • Belum ada
  5. Metode mana yang paling sedikit melakukan pertukaran pada [5, 1, 4, 2, 8]?
    • Bubble sort
    • Selection sort
    • Insertion sort
  6. Sebuah daftar sudah terurut. Metode mana yang tetap melakukan n(n − 1)/2 perbandingan?
    • Bubble sort dengan berhenti lebih awal
    • Selection sort
    • Insertion sort
  7. Berapa perbandingan yang dilakukan bubble sort (dengan berhenti lebih awal) pada [5, 1, 4, 2, 8]?
  8. Daftar berisi 1000 nilai menjadi 2000 nilai. Kira-kira bagaimana perubahan pekerjaan insertion sort dalam kasus terburuk?
    • Bertambah dua kali lipat
    • Naik sekitar empat kali
    • Naik 1000 langkah
    • Tetap sama
  9. Metode mana yang paling tepat untuk daftar yang sudah hampir terurut?
    • Insertion sort
    • Selection sort
    • Semuanya sama saja
  10. Berapa pasangan yang bisa dibentuk dari 100 nilai (jumlah perbandingan kasus terburuk, n(n − 1)/2)?
  11. Susun daftar [3, 1, 2] sesuai urutan bentuk yang dilaluinya selama insertion sort.
Poin penting
  • Bubble sort menukar tetangga; setiap lintasan membawa nilai terbesar ke ujung.
  • Selection sort selalu melakukan n(n − 1)/2 perbandingan dan paling banyak n − 1 pertukaran.
  • Insertion sort cepat pada daftar yang hampir terurut.
  • Bubble sort dan insertion sort melakukan satu pertukaran untuk setiap inversi.
  • Ketiganya butuh sekitar n² langkah dalam kasus terburuk.
Sumber kursus ini (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
  • Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
  • with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
  • MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
  • D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
  • Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
  • Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
  • Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
  • Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
  • Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.

Diperiksa: 2026-10-17