Menu
CoddyTech

Counting Sort

Terakhir diperbarui

Counting sort adalah algoritma pengurutan tanpa perbandingan untuk integer dalam rentang yang diketahui dan terbatas. Algoritma ini menghitung berapa kali setiap nilai muncul, lalu memakai hitungan itu untuk menulis setiap nilai langsung ke posisi terurutnya, tanpa perlu perbandingan. Tekan Putar di atas untuk melihat nilai-nilai dihitung lalu ditempatkan kembali secara berurutan.

Counting sort berjalan dalam waktu O(n + k), dengan k adalah rentang nilai input. Jika k tidak jauh lebih besar daripada n, algoritma ini sangat cepat dan bisa mengalahkan pengurutan berbasis perbandingan O(n log n). Namun, jika rentang nilainya sangat besar, array hitungan O(k) membuatnya tidak praktis.

Kompleksitas waktu dan ruang

KasusKompleksitasCatatan
WaktuO(n + k)n elemen, k = rentang nilai
RuangO(n + k)Array hitungan + array output
StabilYaJika ditempatkan dari kanan ke kiri dengan prefix sum
Perbandingan?TidakMengurutkan dengan menghitung, bukan membandingkan
Paling cocok untukRentang integer kecilk mendekati n

Langkah demi langkah

LangkahApa yang terjadi
1Cari nilai maksimum untuk menentukan ukuran array hitungan.
2Hitung berapa kali setiap nilai muncul.
3(Opsional) Ubah hitungan menjadi prefix sum agar pengurutan stabil.
4Tulis setiap nilai ke output sebanyak jumlah kemunculannya.
5Array output kini sudah terurut sepenuhnya.

Contoh penerapan

Mengurutkan [1, 4, 1, 2, 4] (nilainya berkisar dari 0 sampai 4, jadi array hitungan punya 5 slot):

TahapKeadaanAksi
Pindai inputcount = [0, 2, 1, 0, 2]Hitung kemunculan: 1 muncul dua kali, 2 sekali, 4 dua kali.
Prefix sumcount = [0, 2, 3, 3, 5]Setiap slot kini menyimpan berapa banyak nilai yang <= indeksnya, sehingga memberi posisi akhir.
Tempatkan 4output = [_, _, _, _, 4]Baca dari kanan ke kiri: count[4] = 5, jadi 4 masuk ke indeks 4; kurangi menjadi 4.
Tempatkan 2output = [_, _, 2, _, 4]count[2] = 3, jadi 2 masuk ke indeks 2; kurangi menjadi 2.
Tempatkan 1output = [_, 1, 2, _, 4]count[1] = 2, jadi 1 masuk ke indeks 1; kurangi menjadi 1.
Tempatkan 4output = [_, 1, 2, 4, 4]count[4] = 4, jadi 4 yang ini masuk ke indeks 3; kurangi menjadi 3.
Tempatkan 1output = [1, 1, 2, 4, 4]count[1] = 1, jadi 1 yang ini masuk ke indeks 0. Array sudah terurut.

Kapan memakai counting sort

Pakai saatHindari saat
Kamu mengurutkan integer (atau key yang bisa dipetakan ke integer) dalam rentang kecil yang diketahui.Rentang nilai k jauh lebih besar daripada jumlah elemen n.
Kamu butuh waktu linear O(n + k) dan sanggup menanggung array tambahan.Memori terbatas: array hitungan berbiaya O(k) berapa pun n-nya.
Kamu butuh pengurutan stabil sebagai subrutin (misalnya di dalam radix sort).Key-nya berupa float, string, atau objek sembarang tanpa pemetaan ke integer.
Nilai maksimumnya terbatas dan murah dihitung di awal.Rentangnya tidak diketahui atau tidak terbatas, jadi kamu tidak bisa menentukan ukuran array hitungan.

Kode Counting Sort

Implementasi Counting Sort yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Counting Sort dalam Python

Python
1def counting_sort(a):2    # Works for non-negative integers with a small max value3    counts = [0] * (max(a) + 1)4    for value in a:5        counts[value] += 16    # Prefix sums turn counts into final positions7    for i in range(1, len(counts)):8        counts[i] += counts[i - 1]9    out = [0] * len(a)10    for value in reversed(a):  # reversed keeps equal values stable11        counts[value] -= 112        out[counts[value]] = value13    return out14
15
16nums = [4, 2, 2, 8, 3, 3, 1]17print("Before:", nums)18print("After: ", counting_sort(nums))
Jalankan kode ini di Playground Python

FAQ Counting Sort

Berapa kompleksitas waktu counting sort?
Counting sort bernilai O(n + k), dengan n adalah jumlah elemen dan k adalah rentang nilai yang mungkin. Jika k = O(n), ini adalah waktu linear. Ruang tambahan yang dipakai O(n + k).
Apakah counting sort stabil?

Bisa. Versi stabilnya membangun prefix sum dari hitungan dan menempatkan elemen dari kanan ke kiri, sehingga urutan relatif key yang sama tetap terjaga. Versi sederhana "tulis ulang berdasarkan nilai" yang ditampilkan di sini menghasilkan pengurutan yang benar, tetapi terutama dipakai untuk integer biasa.

Kapan sebaiknya memakai counting sort?
Pakai counting sort saat mengurutkan integer (atau key yang bisa dipetakan ke integer) dalam rentang kecil yang diketahui. Jika rentang nilai k jauh lebih besar daripada jumlah elemen, array hitungan akan memboroskan memori dan pengurutan berbasis perbandingan lebih baik.
Apa perbedaan counting sort dan radix sort?
Counting sort mengurutkan berdasarkan nilai utuh dalam satu putaran dan butuh array hitungan sebesar rentang nilainya. Radix sort mengurutkan digit demi digit dan biasanya memanggil counting sort yang stabil untuk setiap digit, sehingga rentang per putaran tetap kecil (misalnya 10 untuk digit desimal). Radix sort bisa menangani rentang nilai besar yang akan membuat satu counting sort tidak praktis.
Mengapa counting sort tidak selalu lebih cepat daripada quicksort?
Counting sort bernilai O(n + k), jadi hanya menang saat rentang nilai k sebanding dengan n. Jika k sangat besar, misalnya mengurutkan 100 nilai dalam rentang 0 sampai 1,000,000,000, array hitungan O(k) mendominasi dan memboroskan memori, sementara pengurutan berbasis perbandingan O(n log n) seperti quicksort tetap cepat dan hemat ruang.
Bisakah counting sort menangani bilangan negatif?
Bisa, dengan sedikit offset. Alih-alih mengindeks array hitungan langsung dengan nilainya, indekslah dengan value - min, sehingga nilai terkecil dipetakan ke indeks 0. Ukuran array hitungan menjadi max - min + 1. Lupa memakai offset ini adalah bug umum yang membuat program crash pada input negatif.
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai