public class Tugas2CountingSort {
/** Membuat function sort, untuk mengurutkan array berdasarkan jumlah frekuensi **/
void sort(char arr[]) {
int n = arr.length;
char output[] = new char[n];
/** Array Count[] berfungsi untuk menyimpan jumlah kemunculan tiap karakter ASCII (0-255) **/
int count[] = new int[256];
System.out.println("\nStep 1 : Inisialisasi count[] ke 0");
for(int i = 0; i < 256; ++i)
{
count[i] = 0;
}
System.out.println("Semua nilai count[i] di-set ke 0");
System.out.println("\nStep 2 : Hitung Frekuensi karakter ASCII");
for(int i = 0; i < n; i++)
{
++count[arr[i]];
System.out.printf("Karakter '%c' ditemukan, count['%c'] sekarang = %d\n", arr[i], arr[i], count[arr[i]]);
}
/** Menampilkan Frekuensi akhir tiap karakter yang ada **/
System.out.println("\nFrekuensi akhir : ");
for(int i = 0; i < 256; ++i)
{
if(count[i] > 0)
{
System.out.printf(" %c : %d kali\n", (char)i, count[i]);
}
}
System.out.println("\nStep 3 : Buat Count Kumulatif (untuk menentukan posisi terakhir karakter");
/** Membuat Count Kumulatif **/
int lastCount = 1;
for(int i = 1; i <= 255; ++i)
{
if(count[i] > 0)
{
System.out.println("Menkumulatifkan " + count[i] + " dengan " + count[i - 1] );
count[i] += count[i - lastCount];
lastCount = 1;
} else {
lastCount++;
}
}
/** Cetak hasil Kumulatif karakter yang muncul **/
System.out.println("Nilai count[] setelah kumulatif:");
for(int i = 0; i < 256; ++i)
{
if(count[i] > 0)
{
System.out.printf(" %c : %d\n", (char)i, count[i]);
}
}
System.out.println("\n Step 4: Penempatan ke output[] berdasarkan count kumulatif");
/** Menyusun array output[] berdasarkan posisi akhir yang dihitung dari count[]
* secara Descending
*/
for(int i = n - 1; i >= 0; --i)
{
output[n- count[arr[i]]] = arr[i];
int posisi = count[arr[i]] - 1;
System.out.printf("i=%2d | arr[i]='%c' -> count['%c']=%2d -> output[%d]='%c'\n",
i, arr[i], arr[i], count[arr[i]], posisi, arr[i]);
--count[arr[i]];
}
/** Tampilkan hasil output sementara **/
System.out.println("\nHasil output[] setelah semua penempatan :");
for(char c : output) System.out.print(c + " ");
System.out.println();
System.out.println("\nStep 5 : Salin output[] ke arr[]");
/** Menyalin kembali hasil akhir dari output[] ke array utama arr[] **/
for(int i = 0; i < n; i++)
{
arr[i] = output[i];
System.out.printf("arr[%2d] = '%c'\n", i, arr[i]);
}
System.out.println("\nArray sudah terurut sepenuhnya secara descending");
}
public static void main(String args[]) {
/** Deklarasi Variabel **/
char a1 = 'g';
char a2 = 'e';
char a3 = 'e';
char a4 = 'k';
char a5 = 's';
char a6 = 'f';
char a7 = 'o';
char a8 = 'r';
char a9 = 'g';
char a10 = 'e';
char a11 = 'e';
char a12 = 'k';
char a13 = 's';
char arr[] = {a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13};
System.out.print("Array sebelum dilakukan sorting : ");
for (char c : arr) System.out.print(c + " ");
System.out.println();
/** Membuat Variabel Tugas2CountingSort **/
Tugas2CountingSort ob = new Tugas2CountingSort();
/** Menjalankan function sort **/
ob.sort(arr);
System.out.print("\nSetelah dilakukan sorting secara Descending : ");
for(char c : arr) System.out.print(c + " ");
System.out.println();
/** Analisa Algoritma Counting Sort **/
String hasilAnalisa = """
================================================
KESIMPULAN ALGORITMA COUNTING SORT
================================================
Counting Sort adalah algoritma pengurutan non-komparatif
(tanpa perbandingan)yang bekerja dengan cara menghitung jumlah
kemunculan tiap elemen.
Proses utama:
1. Inisialisasi array count[] berukuran 256 dengan nilai awal 0.
2. Hitung jumlah kemunculan setiap karakter dari array input.
3. Ubah count[] menjadi bentuk kumulatif untuk mengetahui posisi akhir.
4. Tempatkan elemen ke array output[] sesuai posisi kumulatif,
dan disusun secara Descending
5. Salin hasil akhir dari output[] ke arr[].
Kelebihan:
- Sangat cepat untuk rentang data kecil.
- Tidak menggunakan perbandingan antar elemen.
Kekurangan:
- Membutuhkan memori tambahan (array count dan output).
- Tidak cocok untuk data dengan rentang nilai yang sangat besar.
Contoh hasil:
Array awal : [g, e, e, k, s, f, o, r, g, e, e, k, s]
Hasil akhir : [s, s, r, o, k, k, g, g, f, e, e, e, e]
================================================
""";
System.out.println(hasilAnalisa);
}
}