Insertion Sort
Terakhir diperbarui
Insertion sort adalah algoritma pengurutan yang membangun array terurut satu elemen demi satu elemen. Algoritma ini mengambil elemen berikutnya yang belum terurut (disebut "kunci"), menggeser setiap elemen yang lebih besar di bagian terurut satu slot ke kanan, lalu menaruh kunci itu di celah yang terbuka. Caranya persis seperti kebanyakan orang mengurutkan kartu remi di tangan. Tekan Putar di atas untuk melihat setiap kunci disisipkan, atau jalankan pergeserannya satu per satu.
Insertion sort sangat cepat pada input yang kecil atau hampir terurut: algoritma ini berjalan dalam O(n) jika datanya sudah terurut. Itulah sebabnya banyak algoritma pengurutan hibrida beralih ke insertion sort untuk subarray yang kecil.
Kompleksitas waktu dan ruang
| Kasus | Kompleksitas | Catatan |
|---|---|---|
| Kasus terbaik | O(n) | Sudah terurut |
| Kasus rata-rata | O(n²) | Urutan acak |
| Kasus terburuk | O(n²) | Terurut terbalik |
| Ruang | O(1) | In-place |
| Stabil | Ya | Elemen yang sama mempertahankan urutan relatifnya |
Langkah demi langkah
| Langkah | Apa yang terjadi |
|---|---|
| 1 | Anggap elemen pertama sebagai bagian terurut berukuran satu. |
| 2 | Ambil elemen berikutnya sebagai kunci. |
| 3 | Geser setiap elemen terurut yang lebih besar daripada kunci satu slot ke kanan. |
| 4 | Sisipkan kunci ke celah yang terbuka. |
| 5 | Ulangi sampai setiap elemen sudah disisipkan. |
Contoh penerapan
Mengurutkan [5, 2, 4, 1]:
| Putaran | Array | Aksi |
|---|---|---|
| Mulai | [5, 2, 4, 1] | 5 adalah bagian terurut awal berukuran satu. |
| 1 | [2, 5, 4, 1] | Kunci 2: geser 5 ke kanan, sisipkan 2 di depan. |
| 2 | [2, 4, 5, 1] | Kunci 4: geser 5 ke kanan, 2 lebih kecil jadi berhenti, sisipkan 4. |
| 3 | [1, 2, 4, 5] | Kunci 1: geser 5, 4, 2 ke kanan, sisipkan 1 di depan. |
| Selesai | [1, 2, 4, 5] | Setiap elemen sudah disisipkan; array sudah terurut. |
Kapan memakai insertion sort
| Pakai saat | Hindari saat |
|---|---|
Array-nya kecil (kira-kira n < 20). | Array-nya besar dan urutannya acak. |
Datanya sudah hampir terurut, sehingga memberi kasus terbaik O(n). | Kamu butuh kasus terburuk O(n log n) yang terjamin. |
Kamu butuh pengurutan stabil dan in-place dengan ruang tambahan O(1). | Elemen mahal untuk dipindahkan, karena algoritma ini melakukan banyak pergeseran. |
| Data datang sedikit demi sedikit dan harus tetap terurut secara online. | Inputnya terurut terbalik, yang merupakan kasus terburuk O(n²). |
Kode Insertion Sort
Implementasi Insertion Sort yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C, Pseudocode. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.
Kode Insertion Sort dalam Python
1def insertion_sort(a):2 for i in range(1, len(a)):3 key = a[i]4 j = i - 15 # Shift larger elements one slot to the right6 while j >= 0 and a[j] > key:7 a[j + 1] = a[j]8 j -= 19 a[j + 1] = key10 return a11
12
13nums = [7, 3, 9, 1, 5, 8, 2]14print("Before:", nums)15insertion_sort(nums)16print("After: ", nums)Kode Insertion Sort dalam JavaScript
1function insertionSort(a) {2 for (let i = 1; i < a.length; i++) {3 const key = a[i];4 let j = i - 1;5 // Shift larger elements right to open a slot for key6 while (j >= 0 && a[j] > key) {7 a[j + 1] = a[j];8 j--;9 }10 a[j + 1] = key;11 }12 return a;13}14
15const data = [5, 2, 9, 1, 7, 3];16console.log("Before:", data);17console.log("Sorted:", insertionSort([...data]));Kode Insertion Sort dalam Java
1import java.util.Arrays;2
3public class Main {4 static void insertionSort(int[] arr) {5 for (int i = 1; i < arr.length; i++) {6 int key = arr[i];7 int j = i - 1;8 // Shift larger elements one slot to the right9 while (j >= 0 && arr[j] > key) {10 arr[j + 1] = arr[j];11 j--;12 }13 arr[j + 1] = key;14 }15 }16
17 public static void main(String[] args) {18 int[] arr = {7, 3, 9, 1, 5, 8, 2};19 System.out.println("Before: " + Arrays.toString(arr));20 insertionSort(arr);21 System.out.println("After: " + Arrays.toString(arr));22 }23}Kode Insertion Sort dalam C++
1#include <iostream>2#include <vector>3
4void printVec(const std::vector<int>& a) {5 for (int x : a) std::cout << x << " ";6 std::cout << "\n";7}8
9void insertionSort(std::vector<int>& a) {10 for (size_t i = 1; i < a.size(); ++i) {11 int key = a[i];12 int j = static_cast<int>(i) - 1;13 // Shift larger elements one slot to the right14 while (j >= 0 && a[j] > key) {15 a[j + 1] = a[j];16 --j;17 }18 a[j + 1] = key;19 }20}21
22int main() {23 std::vector<int> data = {7, 3, 9, 1, 5, 8, 2};24 std::cout << "Before: ";25 printVec(data);26 insertionSort(data);27 std::cout << "After: ";28 printVec(data);29 return 0;30}Kode Insertion Sort dalam C
1#include <stdio.h>2
3void printArr(const int a[], int n) {4 for (int i = 0; i < n; i++) printf("%d ", a[i]);5 printf("\n");6}7
8void insertionSort(int a[], int n) {9 for (int i = 1; i < n; i++) {10 int key = a[i];11 int j = i - 1;12 // Shift larger elements one slot to the right13 while (j >= 0 && a[j] > key) {14 a[j + 1] = a[j];15 j--;16 }17 a[j + 1] = key;18 }19}20
21int main(void) {22 int data[] = {7, 3, 9, 1, 5, 8, 2};23 int n = sizeof(data) / sizeof(data[0]);24 printf("Before: ");25 printArr(data, n);26 insertionSort(data, n);27 printf("After: ");28 printArr(data, n);29 return 0;30}Kode Insertion Sort dalam Pseudocode
1DECLARE nums : ARRAY[1:7] OF INTEGER2DECLARE n : INTEGER3n ← 74nums[1] ← 75nums[2] ← 36nums[3] ← 97nums[4] ← 18nums[5] ← 59nums[6] ← 810nums[7] ← 211DECLARE i : INTEGER12DECLARE j : INTEGER13DECLARE key : INTEGER14
15// Insert each value into the sorted part on its left16FOR i ← 2 TO n17 key ← nums[i]18 j ← i - 119 WHILE j > 0 AND nums[j] > key DO20 nums[j + 1] ← nums[j]21 j ← j - 122 ENDWHILE23 nums[j + 1] ← key24NEXT i25
26FOR i ← 1 TO n27 OUTPUT nums[i]28NEXT iFAQ Insertion Sort
Berapa kompleksitas waktu insertion sort?
O(n²) pada kasus rata-rata dan terburuk, tetapi O(n) pada array yang sudah terurut atau hampir terurut. Ruang tambahan yang dipakai O(1).Apakah insertion sort stabil?
Ya. Insertion sort hanya menggeser elemen yang benar-benar lebih besar daripada kunci, jadi elemen yang sama tidak pernah saling melewati dan urutan relatifnya tetap terjaga.
Kapan sebaiknya memakai insertion sort?
Pakai insertion sort untuk array kecil atau data yang sudah hampir terurut. Karena bebannya rendah dan kasus terbaiknya adaptif, algoritma hibrida seperti Timsort memakainya untuk run yang kecil.
Apa perbedaan insertion sort dan bubble sort?
O(n²), tetapi insertion sort menggeser elemen untuk membuka celah bagi kunci, sedangkan bubble sort berulang kali menukar pasangan bersebelahan yang urutannya salah. Insertion sort biasanya melakukan lebih sedikit penulisan dan berkinerja lebih baik dalam praktik, terutama pada data yang hampir terurut, tempat algoritma ini mencapai kasus terbaik O(n).Mengapa insertion sort lebih cepat daripada merge sort pada array kecil?
O(n log n) meskipun kompleksitas asimtotiknya lebih buruk. Itulah persis alasan algoritma hibrida seperti Timsort dan introsort beralih ke insertion sort untuk subarray yang kecil.Apakah insertion sort lebih cocok untuk linked list atau array?
O(n²).