Jumat, 04 Januari 2013

Array - Sorting data dengan Counting Sort

Sorting data menggunakan counting sort............ Sorting = pengurutan , Counting = penjumlahan..... jadi apa hayo ??

Adalah mengurutkan data dengan mencari jumlah data yang sama dalam suatu array lalu mengurutkannya. Ilustrasinya seperti ini :





Dari Ilustrasi di atas sudah paham ceritanya kah ?

Jika belum simaklah.........
                   Pada suatu hari ada Array dengan nilai acak bernama "D" (Variabel D[]). Nah dia meminta nilainya diurutkan nih dengan counting sort. Jadi kita butuh array tambahan bernama "Tabcount" (Variabel Tabcount[]) < Array cadangan yang nantinya digunakan untuk mengelompokan data yang sama. Saya ambil contoh pada ilustrasi di atas adalah nilai 1 di "D" ada sebanyak 4 ( index 1, 3, 7 dan 10 ), nah nilai 1 ini dikelompokan ke "Tabcount" pada index ke 1 (si "D" sama si "Tabcount" memiliki nilai sama yaitu 1, tapi 1 di "D" statusnya isi variabel sedangkan 1 di "Tabcount" statusnya jomblo........ eh salah, Index maksudnya... ). Begitu pula dengan nilai yang lainnya. setelah nilai selesai dikelompokan nilai dikeluarkan lagi ke "D" yang baru secara urut. Jadi Ceritanya kaya' Titanic noh pas Scene penyelamatan penumpang, jadi misal penumpang kelas satu sudah selesai dimasukin ke sekoci dilanjutkan ke penumpang kelas di bawahnya.......Ngesss..... 

Pertama butuh 2 fungsi yang sebenarnya tidak dibahas tetapi digunakan dan berikut fungsi main dan tulis :





 
Dan fungsi Counting sort dalam bahasa C nya seperti ini
:
(Catatan : karena Array dimulai dari enol maka anggap saja ilustrasi di atas juga dimulai dari enol ya... :), jangan satu )


void CountingSort(DataInt d, int n)
{
    int j,a,Max=0;


     /*Scene ini digunakan untuk mencari nilai maksimal dari si variabel D (Array) yang nantinya digunakan sebagai index terakhir si variabel Tabcount (Array) seperti yang diatas tadi index D sampai 10 sedangkan index  Tabcount hanya 5 karena nilai maksimal dari array D adalah 5 OK*/
    for(j=0;j<n;j++)
     {
        if(Max
<d[j])
        {
            Max=d[j];
        }
    }


    /*Didefinisikan variabel Tabcount(Array) dengan tipe data integer dengan ukuran nilai Maksimal dari  D (Array) dalam cerita diatas jadi tabcount[5]*/
    int tabcount[Max];



    /*pengulangan i nilai 0 sampai maksimal yang nantinya digunakan untuk membandingkan apakah nilai D sama dengan index Tabcount*/
    for(i=0;i<=Max;i++)
    {


        /*nilai a didefinisikan dengan 0 yang nantinya digunakan sebagai nilai dari array Tabcount */
        a=0;


         
        /*pengulangan j (dalam cerita di atas dari 1-10) digunakan untuk mengulang Array D[j] */
        for( j=0;j<n;j++)
       {



            /*Apakah nilai d[j] sama dengan nilai i jika sama maka a ditambah satu, misal nih nilai i=1, dan dalam array d (dengan pengulangan j) ditemukan 1 sebanyak 4 maka nilai a menjadi 4 gitu... */
            if(d[j]==i)
            {
                a++;
            }


            /*nah selanjutnya nilai dari tabcount[i] menjadi a, artinya tabcount[1] = 4 dalam comment sebelumya */
            tabcount[i]=a;
        }
    }


    /* Nilai a kembali diisikan 0*/
    a=0;


     /*setelah nilai Tabcount dari 0-max terisi selanjutnya diulang untuk mengisikan nilai Array D yang baru*/
    for(i=0;i<=Max;i++)
    {



        /*Selanjutnya adalah pengulangan j dari a sampai n, kenapa j=a dan a=0 saya letakan di paling luar..... kenapa coba ??? jadi ceritanya begini, pengulangan j digunakan untuk mengulang array D, jadi misal setelah nilai D1 terisi pindah ke D2, nantinya pas pengulangan i (yang diatas) lanjut ke nilai berikutnya dia fokus sama nilai a yang baru, bukan nilai a=0 lagi.... jadi mirip ceritanya titanic toh pas penumpang kelas satu sudah masuk sekoci 1 dan 2 terus kelas satu selesai, penumpang kelas dibawahnya ya dimasukan ke sekoci 3 dan selanjutnya, bukan kembali fokus ke sekoci 1 dan 2, misal sekoci 1 dan 2 masih dipikir keburu kapalnya tenggelam nanti*/
        for(j=a;j<n;j++)
       {

            /*disini diseleksi apakah nilai tabcount[i] sama dengan 0 atau tidak, artinya tabcount2 yang nilainya 0 ( dalam ilustrasi paling atas berarti nilai 4 tidak ada) tidak perlu digagas. langsung fokus ke tabcount selanjutnya......... jadi misal harusnya sekoci 5 digunakan untuk penumpang kelas dua, dan ternyata penumpang kelas dua sudah tenggelam semua, ya langsung fokus sekoci 5digunakan penumpang kelas selajutnya, jangan dibiarkan kosong > mubazir OK */
            if(tabcount[i]!=0)
            {
                d[j]=i;


                /*nah misal nilai tabcount[i=0] = 2 maka d[j=0] diisi (tepat di atas), lanjut.nilai tabcount[i] yang tadi 2 jadi 1 karena  tabcount[i]=tabcount[i]-1, terus nilai a yang tadi 0 jadi 1 karena a++, selanjutnya d[j=1] diisi - tabcount[i=0] jadi 0 terus a jadi 2, selanjutnya karena tabcount[i=0]=0, tidak digagas, maka lanjut ke tabcount[i=1] dengan nilai a=2............ jadi seperti di titanic misal penumpang kelas satu butuh 2 sekoci, kita isi sekoci 1 terus suruh menjauh, lalu sekoci untuk kelas satu tinggal 1 (untuk sisanya), setelah diisi suruh menjauh lagi, kan habis jatah sekoci.... lanjut ke sekoci 3 untuk kelas berikutnya. jika mereka memilih untuk mati tenggelam..............YA SUDAH !!, biarin aja mati, fokus sama kelas selanjutnya untuk sekoci yang masih tersisa.....OK */
                tabcount[i]=tabcount[i]-1;
                a++;
            }
        }
    }
}


Beginilah sintac bahasa C beserta penjelasan yang sebenarnya dipaksa masuk akal...... Semoga bermanfaat... jangan lupa dicomment.... :)

2 komentar:

dzombhiee.crew mengatakan...

weleh weleh cah ....
ngawe dewe kabeh kwi ?

Cahyo Saputro | Genk mengatakan...

ha ha ha....... i like blogging