Selection Sort
Terakhir diperbarui
Selection sort adalah algoritma pengurutan yang membagi array menjadi bagian terurut di kiri dan bagian belum terurut di kanan. Pada setiap putaran, algoritma ini memindai bagian yang belum terurut untuk mencari elemen terkecil, lalu menukarnya ke posisi pertama yang belum terurut, sehingga bagian terurut bertambah satu. Tekan Putar di atas untuk melihat proses pindai dan tukarnya, atau jalankan satu perbandingan demi satu perbandingan.
Selection sort selalu melakukan jumlah perbandingan yang sama apa pun inputnya, tetapi melakukan paling banyak n-1 penukaran, jauh lebih sedikit daripada bubble sort, dan hal ini bisa penting saat penulisan ke memori mahal.
Kompleksitas waktu dan ruang
| Kasus | Kompleksitas | Catatan |
|---|---|---|
| Kasus terbaik | O(n²) | Perbandingan tetap terjadi meskipun sudah terurut |
| Kasus rata-rata | O(n²) | Urutan acak |
| Kasus terburuk | O(n²) | Terurut terbalik |
| Ruang | O(1) | In-place |
| Stabil | Tidak | Penukaran bisa mengubah urutan elemen yang sama |
Langkah demi langkah
| Langkah | Apa yang terjadi |
|---|---|
| 1 | Anggap seluruh array belum terurut. |
| 2 | Pindai bagian yang belum terurut untuk mencari elemen minimum. |
| 3 | Tukar elemen minimum itu ke posisi pertama yang belum terurut. |
| 4 | Geser batasnya satu langkah ke kanan (slot itu kini sudah terurut). |
| 5 | Ulangi sampai hanya tersisa satu elemen yang belum terurut. |
Contoh penerapan
Mengurutkan [5, 2, 4, 1]:
| Putaran | Array | Aksi |
|---|---|---|
| Mulai | [5, 2, 4, 1] | Seluruh array belum terurut. |
| 1 | [1, 2, 4, 5] | Pindai [5, 2, 4, 1], minimumnya 1 di indeks 3; tukar dengan indeks 0. |
| 2 | [1, 2, 4, 5] | Pindai [2, 4, 5], minimumnya 2 yang sudah di indeks 1; ditukar dengan dirinya sendiri. |
| 3 | [1, 2, 4, 5] | Pindai [4, 5], minimumnya 4 yang sudah di indeks 2; tidak perlu dipindahkan. |
| Selesai | [1, 2, 4, 5] | Hanya tersisa 5, jadi elemen itu sudah di tempatnya. |
Kapan memakai selection sort
| Pakai saat | Hindari saat |
|---|---|
Penulisan ke memori mahal: algoritma ini melakukan paling banyak n-1 penukaran. | Array-nya besar: perbandingan O(n²) mendominasi. |
| Kamu butuh pengurutan in-place yang sederhana dan mudah diimplementasikan. | Kamu butuh pengurutan stabil yang mempertahankan urutan key yang sama. |
Memori terbatas: algoritma ini hanya memakai ruang tambahan O(1). | Datanya hampir terurut: algoritma ini tidak bisa selesai lebih awal seperti insertion sort. |
| Datanya sangat kecil dan performa yang bisa diprediksi itu penting. | Throughput penting: pengurutan O(n log n) seperti quicksort jauh lebih cepat. |
Kode Selection Sort
Implementasi Selection Sort yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C, Pseudocode. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.
Kode Selection Sort dalam Python
1def selection_sort(a):2 n = len(a)3 for i in range(n - 1):4 # Find the smallest element in the unsorted tail5 min_idx = i6 for j in range(i + 1, n):7 if a[j] < a[min_idx]:8 min_idx = j9 a[i], a[min_idx] = a[min_idx], a[i]10 return a11
12
13nums = [64, 25, 12, 22, 11]14print("Before:", nums)15selection_sort(nums)16print("After: ", nums)Kode Selection Sort dalam JavaScript
1function selectionSort(a) {2 for (let i = 0; i < a.length - 1; i++) {3 let min = i;4 // Find the smallest element in the unsorted tail5 for (let j = i + 1; j < a.length; j++) {6 if (a[j] < a[min]) min = j;7 }8 if (min !== i) [a[i], a[min]] = [a[min], a[i]];9 }10 return a;11}12
13const data = [5, 2, 9, 1, 7, 3];14console.log("Before:", data);15console.log("Sorted:", selectionSort([...data]));Kode Selection Sort dalam Java
1import java.util.Arrays;2
3public class Main {4 static void selectionSort(int[] arr) {5 for (int i = 0; i < arr.length - 1; i++) {6 int minIndex = i;7 // Find the smallest value in the unsorted part8 for (int j = i + 1; j < arr.length; j++) {9 if (arr[j] < arr[minIndex]) minIndex = j;10 }11 int tmp = arr[i];12 arr[i] = arr[minIndex];13 arr[minIndex] = tmp;14 }15 }16
17 public static void main(String[] args) {18 int[] arr = {29, 10, 14, 37, 13, 5};19 System.out.println("Before: " + Arrays.toString(arr));20 selectionSort(arr);21 System.out.println("After: " + Arrays.toString(arr));22 }23}Kode Selection Sort dalam C++
1#include <iostream>2#include <utility>3#include <vector>4
5void printVec(const std::vector<int>& a) {6 for (int x : a) std::cout << x << " ";7 std::cout << "\n";8}9
10void selectionSort(std::vector<int>& a) {11 for (size_t i = 0; i + 1 < a.size(); ++i) {12 // Find the smallest element in the unsorted suffix13 size_t minIdx = i;14 for (size_t j = i + 1; j < a.size(); ++j) {15 if (a[j] < a[minIdx]) minIdx = j;16 }17 std::swap(a[i], a[minIdx]);18 }19}20
21int main() {22 std::vector<int> data = {29, 10, 14, 37, 13, 5};23 std::cout << "Before: ";24 printVec(data);25 selectionSort(data);26 std::cout << "After: ";27 printVec(data);28 return 0;29}Kode Selection 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 selectionSort(int a[], int n) {9 for (int i = 0; i < n - 1; i++) {10 // Find the smallest element in the unsorted suffix11 int minIdx = i;12 for (int j = i + 1; j < n; j++) {13 if (a[j] < a[minIdx]) minIdx = j;14 }15 int tmp = a[i];16 a[i] = a[minIdx];17 a[minIdx] = tmp;18 }19}20
21int main(void) {22 int data[] = {29, 10, 14, 37, 13, 5};23 int n = sizeof(data) / sizeof(data[0]);24 printf("Before: ");25 printArr(data, n);26 selectionSort(data, n);27 printf("After: ");28 printArr(data, n);29 return 0;30}Kode Selection 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 minIndex : INTEGER14DECLARE temp : INTEGER15
16// Select the smallest remaining value and swap it into place17FOR i ← 1 TO n - 118 minIndex ← i19 FOR j ← i + 1 TO n20 IF nums[j] < nums[minIndex] THEN21 minIndex ← j22 ENDIF23 NEXT j24 IF minIndex <> i THEN25 temp ← nums[i]26 nums[i] ← nums[minIndex]27 nums[minIndex] ← temp28 ENDIF29NEXT i30
31FOR i ← 1 TO n32 OUTPUT nums[i]33NEXT iFAQ Selection Sort
Berapa kompleksitas waktu selection sort?
O(n²) pada semua kasus, baik terbaik, rata-rata, maupun terburuk, karena selalu memindai seluruh bagian yang belum terurut untuk mencari setiap nilai minimum. Ruang tambahan yang dipakai O(1).Apakah selection sort stabil?
Versi in-place standarnya tidak stabil, karena menukar nilai minimum yang letaknya jauh ke tempatnya bisa memindahkan sebuah elemen melewati elemen lain yang nilainya sama. Ada varian yang stabil, tetapi butuh pergeseran alih-alih penukaran.
Kapan selection sort berguna?
n-1 penukaran, jumlah paling sedikit yang mungkin untuk pengurutan berbasis perbandingan yang memindahkan elemen.Apa perbedaan selection sort dan bubble sort?
O(n²), tetapi selection sort melakukan paling banyak n-1 penukaran, sedangkan bubble sort bisa melakukan hingga O(n²) penukaran. Bubble sort juga bisa mendeteksi array yang sudah terurut dan berhenti lebih awal, sementara selection sort selalu menjalankan seluruh putarannya.Sebaiknya memakai selection sort atau insertion sort?
O(n) pada data yang hampir terurut, dan rata-rata lebih cepat. Pilih selection sort hanya saat meminimalkan jumlah penulisan menjadi prioritas, karena algoritma ini menjamin paling banyak n-1 penukaran.Mengapa selection sort selalu berjalan dalam O(n²), bahkan pada array yang sudah terurut?
O(n²), tidak seperti insertion sort atau bubble sort yang bisa berhenti lebih awal.