0

Naik darah

Seminggu belakangan (which is 3 hari terakhir), bawaannya mau naik darah aja. Terutama sama kolega plus rekan kerja. Walaupun sebenarnya, ini bukan tentang mereka. Ini tentang saya sendiri dan apa yang ada dalam pikiran saya.

Udah dari lama, saya sadar banget kalau lingkungan saya dipenuhi orang-orang berfikiran sempit dengan ego di atas rata-rata. Beberapa di antaranya bahkan terkesan sulit diatur dan menganggap atasan-tak-tersentuh, ga lebih dari seorang yang bisa dimusuhi secara massal untuk mempererat persaudaraan sesama staff. 😢😢

Tapi semua itu tertutupi karena saya masih melihat kalau mereka care kepada sesama, masih punya musuh yang sama.. dan yah.. masih mau ngebantu saya kalau lagi kenapa2. Intinya ada sisi baik yang bisa selalu saya lihat.

Dan beberapa hari terakhir, dimulai dari Kamis sampai kemarin.. Saya jadi melihat mereka sebagai sosok berbeda. Penuh dengan keluhan, memikirkan bidang masing-masing, berusaha menang atas pendapat sendiri. Juga memuji diri sendiri berlebihan, dengan menyalahkan orang lain yang tidak sependapat dengan sindiran. Well, saya ga tahan dengan segala sindiran dan keluhan itu. 😞

Dan lagi-lagi, ini bukan tentang mereka.. ini tentang saya dan pikiran ini. Mungkin saya butuh hiburan aja yah.. sepertinya, saya butuh tidur mulai dari jam 9 malam ini sampai sebulan ke depan buat memperbaiki mood. πŸ˜”

Ok.. off lagi lhah berarti. 😴

Advertisements
0

Ini.si.a.tif = sulit (?!)

Inisiatif adalah hal yang sulit buat saya secara pribadi.. kalau kamu bertanya kenapa??.. jawabannya karena.. yah, kita hidup di jaman penuh orang2 judgemental. Nge-judge mental2in harapan kamu.

Ketika setiap orang bertindak, motivasinya pasti beda-beda kan yah. Ada yang sekedar karena wajib (daripada kena dosa–atau minimalnya Omelan lhah), ada yang menganggap ibadah, ada yang memang ingin mengambil keuntungan.. dan ada juga yang mengharap pujian karena lagi dilihat kecengan.

Buat saya, inisiatif timbul karena faktor terakhir yang udah ditulis di atas.. yaitu mengharap pujian dan ingin dilihat. Sebenarnya ga harus dipuji. Cukup dilihat, dan dikagumi. Cukup. Ga lebih, ga kurang. Berawal dari ini.. inisiatif bagi saya, adalah motivasi untuk bekerja sebaik mungkin karena merasa diperhatikan. Hmmm.. ini mirip kayak murid-murid yang berusaha terlihat sok serius saat mengerjakan soal ujian pas lagi dilihat sama guru.. atau pengikut tarekat tertentu yang musti pajang foto gurunya supaya ibadah lebih khusu’.

Terus sulitnya inisiatif ini di mana?! Mungkin kamu bertanya-tanya gitu.. dan jawabannya terletak dari hal penyebab dari judul tulisan ini. Bingung? Pasti bingung! Yuk kita runut bareng..

Kita bicara tentang inisiatif. Inisiatif adalah motivasi. Motivasi ini.. menyimpan harapan. Harapan ini lhah yang bikin sulit.. karena harapan itu terkait dengan tindakan orang lain. Kamu punya motivasi supaya dilihat, dikagumi, dan dipuji.. maka berharap untuk dilihat orang lain, dikagumi orang lain, dan pastinya dipuji orang lain. Ada tindakan orang lain dalam pikiran kamu. Ketika harapan itu tidak terjawab.. yah.. selesai lah tindakan kamu. Ini tuh mirip kayak kamu yang nganggap kalau kamu udah berbuat baik, tapi ternyata buat orang lain, kami itu jahat! Terpuruk, dan kecewa.. semua usaha terlihat sia-sia dan tanpa hasil.

Beberapa dari kamu mungkin ada yang bilang “ga gitu juga keles! Lebay banget!”.. memang harapan itu ada yang terjawab dengan menjadi kenyataan, ada juga yang cuma jadi angan-angan aja. Tapi satu yang musti kamu ingat.. ketika hal tersebut adalah bagian dari harapan terhadap pihak lain, dan bukan diri sendiri.. artinya kamu mencoba mengatur dia bertindak. Paling ga awalnya gitu dalam benak kamu. Padahal.. pihak lain mempunyai tindakan mereka sendiri secara sadar yang ga bisa kamu atur. Ketika pengaturan yang udah kamu set di awal dalam pikiran kamu karena motivasi tadi.. dan ternyata yang terjadi tidak sesuai pengaturan awal. Pasti kamu jadi sedih. Yap, harapan kamu mental.. sedih pasti.. Minimal kecewa.. iya kan..

Well, tapi faktanya itu wajar. Wajar banget. Itulah kenapa inisiatif itu sulit. Tapi apa iya sesulit itu?! Jawabannya tergantung.. efeknya kualitas, apa kuantitas. Kalau kuantitas, itu ga lebih mirip artis yang punya hater. Move on mah gampang selama masih ada yang dukung. Tapi kalau kualitas, lain cerita.. ini tuh kayak insiatif kasih ngasih bunga-mawar-permintaan-maaf-pake-go-send ke kecengan, tapi ternyata tanggapannya biasa aja.. karena kecengan kamu ga suka bunga. Dia sukanya ke kamu, kenapa kamu ga ngerti2 juga.. gitu deh.

Singkat cerita.. inisiatif itu beneran sulit kalau motivasi kamu terkait sikap orang lain. Kalau kamu udah nyampe di adult life.. kamu musti ngerti banget kalau kamu ga bisa mengatur, atau bahkan mengubah orang lain. Kamu cuma bisa membentuk diri sendiri dan menginspirasi orang lain. Jangan samain sama anak kecil ya.. anak kecil itu terinspirasi dari lingkungan. Mereka belum tau benar-salah. Makanya orang tua dibilang bisa ‘ngebentuk’ karakter anak.. karena orang tua lah yang mereka selalu perhatikan untuk menginspirasi mereka. Itupun kalau anak2 itu tinggal sama orangtuanya ya.. ada kasus khusus, tapi itu ga bisa kita generalisir. Namanya juga kasus khusus.

Dan yah.. gitu ajah deh. Lagi2 tulisan ga jelas lagi. Arrgghh.. kapan c blog ini bisa berhenti nulis tulisan ginian πŸ˜‘ hhh.. ya sudahlah lah ya. Mari disudahi saja daripada makin ga jelas. Selesai!

0

Kejadian

Bogor. Siang. Hari kerja. Jam istirahat. Perempatan. Lampu merah. Berhenti. Lampu hijau. Kecelakaan motor. Tunggal. Oleng? Tidak seimbang? Jatuh. Mobil depan. Berhenti. Mobil belakang. Klakson. Bertubi-tubi. Mungin tidak tau. Atau tidak mau tau. Fakta. Terlihat. Tidak mungkin tidak tahu.

0

Watch “How To Sharpen Dull Knives” on YouTube

Dan.. begitulah caranya ngasah pisau. Yahh.. gitu deh, sebagai ganti posting mv2 dedek2 berbakat dari Korea sana kayak biasanya, paling ga yang ini faedah buat gw. πŸ˜…

Intinya: ngasah pakai batu, atur pisau 23 derajat terhadap batu (bisa pakai bantuan kertas yang dilipat 2x), dan asah permukaan. Awali di bagian kasar, terus ulangi di bagian halus. Pastikan batu asah/whetstone tetap basah selama proses pengasahan.

0

κ³¨λ“ μ°¨μΌλ“œ(Golden Child) “LET ME + Genie” Dance Practice

Lagi2 postingan ga jelas tentang video yang gw tonton.. hahaha..

Ceritanya lagi sukak banget sama boyband asuhan Woolim ini, golden child. Sukak sama dance-nya, suka juga sama lagunya. Membernya?? Uhmmm.. yah, mungkin seiring waktu kali yah. 😬

Buat kamu yang bertanya-tanya.. itu jumlah personel nya berapa.. perasaan banyak banget. Personilnya 10 ajah. Yang pakai baju parade itu. Cuma ada 1 member, joochan, yang perlu istirahat karena cedera pas latihan. Terus yang baju item polos di belakang, pelengkap aja. Entah dancer atau trainee. Kata komen2 YouTube c dancer. Cuma yah, dancer tapi dance-nya kurang powerful dibandingkan member golden child. Jadi berasa ada vibe trainee-nya.

Apapun itu.. mari kita saksikan anak2 emas berbakat ini dengan performance-nya.

0

Generic Types

Di tulisan sekarang, kita bakal bahas dikit tentang Generic Types. Apa itu generic types?! Inti dari generic types itu… sebuah tipe data yang dapat dimasukin nilai apapun. Bingung?! Baiklah… kita mulai dari konsep variabel.

Bayangkan sekarang kamu punya variabel di kode kamu masing-masing. Gambaran dari variabel adalah sebuah kotak yang memiliki kesepatakan terhadap “apa yang disimpan” dalam kotak tersebut, dan juga “jenis yang disimpan”. Contohnya, kamu punya kotak untuk menyimpan jenis-jenis sepatu, maka hal yang harus kamu simpan adalah sepatu. Hal yang kamu simpan bisa sepatu olahraga, sepatu high heel buat ke pesta, atau bahkan sepatu barbie kamu… yang penting, isinya sepatu. Akan salah besar kalau kamu simpan koleksi tas kamu dalam kotak yang dimaksudkan untuk menyimpan sepatu.

Itu konsep variabel… sekarang, bayangkan, ketika ada seseorang yang bakal menggunakan kotak tersebut. Pastinya, orang itu mau menyimpan sesuatu. Tapi… bukan sepatu lah yang mau ia simpan. Dia butuh kotak untuk menyimpan bundle-an revisi TA dari dosen pembimbing-nya. Efeknya, kotak sepatu yang tersedia, udah ga berguna lagi. Dia harus membuat kotak baru untuk menyimpan revisian2 itu. Ga efektif kan?! Harus bikin dari awal, padahal kotak sepatu masih bisa nutup lhah buat nyimpen dokumen semacam revisian TA dengan segala coretan di dalamnya.

Dan di sinilah Generic Types bekerja dengan caranya… memastikan bahwa sebuah variabel dapat menampung nilai dengan fleksibel.

Implementasi generic types yang paling gampang dilihat yaitu di penggunaan Collections dari bahasa pemrograman Java. Contoh paling gampang, di Array List. Pada saat menggunakan array list, kamu bisa menambahkan berbagai elemen dengan tipe data yang berbeda.

import java.util.ArrayList;

public class TipeUmum {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("hai, ini blog");
al.add("arby");
al.add(3);
System.out.println(al);
}
}
//hasil eksekusi: [hai, ini blog, arby, 3]

Lihat contoh di atas kan… Di array list bernama al, kita menambahkan 2 data dengan 2 objek yang berbeda. Tipe berupa string, dan tipe berupa angka (integer). Artinya, untuk implementasi kode array list, programmer-nya pakai tipe generic untuk mengkodekan sifat-sifat dari si list. Dan tipe ini fleksibel banget. Karena selain memberikan kemudahan, tipe ini juga bisa dibuat strict. Contohnya:

import java.util.ArrayList;

public class TipeUmum {
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList();
al.add("hai, ini blog");
al.add(" arby");
al.add(3);
System.out.println(al);
}
}

//kode di atas error, tidak dapat dikompilasi
//baris yang dicoret: baris penyebab error

Kode di atas, itu ga jauh beda dari sebelumnya. Perbedaannya, ada pada penulisan ArrayList<Integer>. Hal ini ga dipunya oleh kode yang sebelumnya. Dan begitulah cara untuk membuat array list strict dalam penggunaannya. Tentang hal ini, ada terkait dengan type erasure yang dilakukan oleh java compiler.. tapi ga usah kita bahas lhah yang itu ya.

Balik lagi ke inti tulisan kita, ArrayList di atas adalah contoh penggunaan tipe umum atau Generic Types. Dan sekarang, seandainya kita akan membuat sebuah implementasi dari generic types, gimana caranya?! Anggap kita mau membuat sebuah struktur data “circular linked list” dengan sifatnya sendiri, tapi data yang diberikan bisa beda-beda… untuk hal ini, kita butuh generic.

Implementasi generic itu dasarnya gampang banget, kamu cuma perlu mengganti setiap tipe data dari variabel yang kamu tuliskan menjadi sebuah huruf kapital. Contoh, kamu punya variabel “int data”, tinggal ganti jadi “T data” atau “D data”. Setelahnya, tambahkan huruf capital tersebut di dekat nama class, diapit dengan diamond. Contohnya, kalau tadi kamu ganti tipenya jadi T, dan ini ada di kelas bernama Box, maka tuliskan “Box<T>“. Hurufnya bisa apapun, yang penting kapital. Iya, itu aja cukup. Cuma, ada kesepakatan dalam konvensi developer, untuk penggunaan huruf kapital, harus mewakili hal-hal berikut:

  1. Untuk mewakili elemen, tuliskan E;
  2. Untuk mewakili kunci elemen (key), tuliskan K;
  3. Untuk mewakili nomor (number), tuliskan N;
  4. Untuk mewakili tipe tertentu (type), tuliskan T;
  5. Untuk mewakili nilai tertentu (value), tuliskan V;
  6. Untuk mewakili parameter 2, 3, 4, dst, tuliskan S, U, V, dst.

Tapi lagi-lagi… hal di atas cuma kesepakatan yah… enggak wajib. Sekarang, kodenya gimana?! Untuk mencoba belajar melihat sifat generic, kita butuh perbandingan antara kode non-generic-types dengan yang generic-types. Dan ini kode yang non-generic-types:

public class Kotak {
    private int barang;

    public void set(int barang) { 
        this.barang = barang; 
    }
    public int get() { 
        return barang; 
    }
}

Untuk menggunakan class di atas, kode main yang mungkin dibuat adalah

public static void main(String[] args) {
Kotak k1 = new Kotak();
k1.set(5);

Kotak k2 = new Kotak();
k2.set(10);
}

Bandingkan dengan penulisan kode dari generic types dari kotak di atas:

public class KotakG<T> {
    private T barang;

    public void set(T barang) {
        this.barang = barang;
    }
    public T get() {
        return barang;
    }
}

Untuk menggunakan class KotakG di atas, kode main yang mungkin dituliskan adalah:

public static void main(String[] args) {
KotakG k1 = new KotakG();
k1.set(5);

KotakG k2 = new KotakG();
k2.set("Revisi TA");
}

Lihat kan yah… di sini, kamu dapat memasukkan 2 tipe data yang berbeda dalam objek yang dibentuk dari class yang sama. Hal ini ga akan kamu bisa lakukan di class Kotak (yang tidak menggunakan konsep generic).

Kode lengkapnya untuk yang KotakG gini:

public class KotakG<T> {
    private T barang;

    public void set(T barang) {
        this.barang = barang;
    }
    public T get() {
        return barang;
    }

    public static void main(String[] args) {
        KotakG k1 = new KotakG();
        k1.set(5);
        System.out.println("Isi kotak k1: "+k1.get());

        KotakG k2 = new KotakG();
        k2.set("Revisi TA");
        System.out.println("Isi kotak k2: "+k2.get());
    }
}

Hasil akhirnya:

Isi kotak k1: 5
Isi kotak k2: Revisi TA

Daaaan.. begitulah. Generic Types ini banyak dibahas kalau udah ngebahas mata kuliah struktur data pakai bahasa Java. Karena, di mata kuliah itu, kita bakal bikin linked list, doubly linked list, circular linked list, tree, graph, dll, dsb dengan data yang disimpan bersifat fleksibel. Bahkan bisa bertipe objek.

FYI, generic types yang kita bahas ini sebenarnya cetek yah… yaaaa, khas nya tulisan blog balita lhah.. kamu bisa lihat berbagai hal lain di sumber-sumber yang saya cantumkan di bawah ini. Dan sekarang, sekian tulisan tentang generic types.. happy learning.

Sumber:

https://docs.oracle.com/javase/tutorial/java/generics/index.htm

https://www.tutorialspoint.com/java/java_generics.htm

https://docs.oracle.com/javase/tutorial/extra/generics/index.html

0

Bubble Sort Part 3: Comb Sort

Postingan lanjutan, sekaligus yang terakhir dari seri bubble sort adalah comb sort. Comb sort merupakan perbaikan yang dibuat para ahli untuk mengatasi kondisi rabbit & turtle yang ada di bubble sort. Cara mengatasinya seperti apa?! Caranya adalah membandingkan 2 nilai elemen dari daftar yang tidak bersebelahan. Ada faktor jarak yang berpengaruh atas nilai apa yang dibandingkan dengan nilai yang mana.

Ilustrasinya, ketika kamu punya 4 nilai: a, b, c, d. Jika kamu mengurutkan menggunakan bubble sort, pasti urutannya adalah

  1. Bandingkan a dan b
  2. Bandingkan b dan c
  3. Bandingkan c dan d

Pasti selalu gitu, sedangkan kalau kamu punya comb sort, kamu bisa membandingkan dengan jarak. Contohnya, membandingkan elemen dengan jarak bernilai 2: maka elemen yang dibandingkan adalah a dengan c; b dengan d.. dan kalau sudah mencapai akhir perbandingan, hitung lagi jarak baru. Nilai jarak ini disebut sebagai gap value. Dan untuk menghitung gap value yang baru, dikenal adanya gap factor. Cara menentukan gap tersebut dilihat pada rumus berikut:

gap_value = gap_value/shrink_factor(k)

gap_value awal = jumlah elemen di list
shrink_factor(k) bisa bernilai berapapun.
dari penelitian sebelumnya, didapat efektif k = 1.3
penelitian tersebut menggunakan 200.000 random list

Satu hal yang harus kamu garisbawahi dan menjadi perhatian adalah, kondisi berhenti dari perulangan ini. Kondisinya adalah tidak ada lagi swapped. Hal ini sama seperti bubble sort. Akan tetapi karena nilai elemen ditukar dalam jarak tertentu, bisa jadi dalam jarak tersebut nilainya memang tidak usah di-swapped lagi sampai elemen akhir yang diperbandingkan, dan kondisi ini bisa menyebabkan perulangan terhenti, sedangkan list masih belum terurut. Sehingga, dibutuhkan satu pengkondisian lagi (selain swapped) untuk menyebabkan algoritma berhenti… yaitu gap value bernilai 1.

Berdasarkan keterangan di atas, kita coba urutkan daftar yang mempunyai kondisi turtle, yaitu: 2 4 7 9 1. Daftar nilai ini sama dengan contoh dari turtle di tulisan sebelumnya. Jadi nanti bisa kita bandingkan. Dan.. beginilah langkah pengurutannya:

Kondisi awal: 2 4 7 9 1
Gap value awal: 5
Kondisi akhir: daftar terurut menaik

First Pass
gap value = 5/1.3 = 3.8 --> 3
2 4 7 9 1 --> 2 4 7 9 1 (swapped tidak terjadi)
2 4 7 9 1 --> 2 1 7 9 4 (swapped terjadi)

Second Pass
gap value = 3/1.3 = 2.3 --> 2
2 1 7 9 4 --> 2 1 7 9 4 (swapped tidak terjadi)
2 1 7 9 4 --> 2 1 7 9 4 (swapped tidak terjadi)
2 1 7 9 4 --> 2 1 4 9 7 (swapped terjadi)

Third Pass
gap value = 2/1.3 = 1.5 --> 1
2 1 4 9 7 --> 1 2 4 9 7 (swapped terjadi)
1 2 4 9 7 --> 1 2 4 9 7 (swapped tidak terjadi)
1 2 4 9 7 --> 1 2 4 9 7 (swapped tidak terjadi)
1 2 4 9 7 --> 1 2 4 7 9 (swapped terjadi)

Fourth Pass
gap value = 1/1.3 = 0.76 --> 1
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)

Algoritma berhenti. Swapped tidak terjadi, gap = 1;
Kondisi akhir: daftar terurut menaik.

Lihat kan?! Lumayan ada perbedaan. Pas di kondisi turtle dengan bubble sort, pass yang harus dilakukan sejumlah 5, sedangkan di comb sort, cukup 4 pass sajah. Sekarang, mungkin kamu bertanya2… kodenya gimana?! Yah, sebenernya kamu cuma butuh lihat sumber yang ada di bawah tulisan ini aja. Tapi berhubung yang nulis blog ini baik, sooo… here is the code

import java.util.Random;

public class Comb_Sort {
    public int[] randomArray(int jumlah) {
        int[] arr = new int[jumlah];
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            arr[i] = r.nextInt(100);
        }
        return arr;
    }
    public void tampilArray(int[] arr){
        for (int i:arr) {
            System.out.print(i+" ");
        }
    }
    public int[] urut(int[] arr)
    {
        int n = arr.length;

        // inisialisasi gap value
        int gap = n;

        boolean swapped = true;

        // lakukan perulangan
        // dan bandingkan nilai seperti bubble sort
        while (gap != 1 || swapped)
        {
            // menghitung gap
            // gap = nilai gap sebelumnya / 1.3
            gap = (gap*10)/13;
            if (gap < 1)
                gap = 1;

            swapped = false;

            // bandingkan seperti bubble
            for (int i=0; i<n-gap; i++)
            {
                if (arr[i] > arr[i+gap])
                {
                    int temp = arr[i];
                    arr[i] = arr[i+gap];
                    arr[i+gap] = temp;

                    swapped = true;
                }
            }
        }
        return arr;
    }

    public static void main(String[] args) {
        Comb_Sort nc = new Comb_Sort();
        int[] array = nc.randomArray(6);
        System.out.println("Array: ");
        nc.tampilArray(array);
        System.out.println("\n\nArray Terurut: ");
        int[] arrayUrut = nc.urut(array);
        nc.tampilArray(arrayUrut);
    }
}

Untuk hasil akhirnya kayak gini:

Begitulah… semoga tulisan ini membantu kamu yang lagi bingung sama bubble sort dan turunannya. Happy learning…

Sumber:
https://en.wikipedia.org/wiki/Comb_sort
https://www.tutorialspoint.com/Comb-Sort
https://www.geeksforgeeks.org/comb-sort/

1

Bubble Sort Part 2: Turtle & Rabbit

Dari posting sebelumnya, kita udah tau ada yang namanya bubble sort, bahkan udah ada program yang bisa di-run segala. Sekarang, kita bakal bahas tentang 2 hal di bubble sort yang menjadi pemikiran para ahli di bidang algoritma pengurutan. 2 hal tersebut yaitu rabbit dan turtle. Apakah kedua hal itu?

Rabbit adalah nilai tinggi yang ada di ujung daftar (sebelah kiri) dari daftar nilai yang akan diurutkan secara menaik. Sedangkan turtle adalah sebaliknya, nilai rendah yang ada di ujung daftar (sebelah kanan) dari daftar nilai yang akan diurutkan menaik.

Rabbit akan lebih cepat untuk diurutkan, sedangkan turtle akan menyebabkan jalannya lama eksekusi dari program pengurutan.

Gimana?! Bisa dimengerti kah? Kalau kamu belum ada bayangan, di sini bisa dilihat contohnya kok. Pertama.. rabbit dulu ya… Rabbit, sesuai definisinya, nilai besar yang ada di ujung sebelah kiri dari daftar yang akan diurutkan menaik. Jadi, contoh valid daftarnya adalah “13 2 4 7 9”. Nilai 13 adalah rabbit. Dan kenapa dia disebut rabbit?! Kita lihat langkah2 pengurutannya:

Kondisi awal: 9 2 4 7 8

First Pass
9 2 4 7 8 --> 2 9 4 7 8 (swapped terjadi)
2 9 4 7 8 --> 2 4 9 7 8 (swapped terjadi)
2 4 9 7 8 --> 2 4 7 9 8 (swapped terjadi)
2 4 7 9 8 --> 2 4 7 8 9 (swapped terjadi)

dikarenakan terjadinya swapped,
maka perbandingan dimulai dari elemen ke-0 sampai ke-(n-1) diulang.

Second Pass
2 4 7 8 9 --> 2 4 7 8 9 (swapped tidak terjadi)
2 4 7 8 9 --> 2 4 7 8 9 (swapped tidak terjadi)
2 4 7 8 9 --> 2 4 7 8 9 (swapped tidak terjadi)
2 4 7 8 9 --> 2 4 7 8 9 (swapped tidak terjadi)

Perulangan berhenti karena swapped tidak terjadi.
Kondisi akhir: daftar terurut menaik.

Lihat kan kenapa dia disebut dengan rabbit?! Cuma butuh 2 pass aja untuk mengurutkan nilainya. Bandingkan dengan turtle berikut. Anggap kita punya daftar nilai 2 4 7 9 1. Nilai 1 adalah turtle karena merupakan nilai kecil yang ada di sebelah kanan daftar yang akan diurutkan menaik:

Kondisi awal: 2 4 7 9 1

First Pass
2 4 7 9 1 --> 2 4 7 9 1 (swapped tidak terjadi)
2 4 7 9 1 --> 2 4 7 9 1 (swapped tidak terjadi)
2 4 7 9 1 --> 2 4 7 9 1 (swapped tidak terjadi)
2 4 7 9 1 --> 2 4 7 1 9 (swapped terjadi)

Second Pass
2 4 7 1 9 --> 2 4 7 1 9 (swapped tidak terjadi)
2 4 7 1 9 --> 2 4 7 1 9 (swapped tidak terjadi)
2 4 7 1 9 --> 2 4 1 7 9 (swapped terjadi)
2 4 1 7 9 --> 2 4 1 7 9 (swapped tidak terjadi)

Third Pass
2 4 1 7 9 --> 2 4 1 7 9 (swapped tidak terjadi)
2 4 1 7 9 --> 2 1 4 7 9 (swapped terjadi)
2 1 4 7 9 --> 2 1 4 7 9 (swapped tidak terjadi)
2 1 4 7 9 --> 2 1 4 7 9 (swapped tidak terjadi)

Fourth Pass
2 1 4 7 9 --> 1 2 4 7 9 (swapped terjadi)
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)

Fifth Pass
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)
1 2 4 7 9 --> 1 2 4 7 9 (swapped tidak terjadi)

Algoritma berhenti. Kondisi akhir: daftar terurut menaik.

Lihat kan?! Perbandingannya, dengan jumlah data yang sama… rabbit cuma butuh 2 pass, sedangkan turtle butuh 5 pass. Makanya namanya rabbit & turtle. Kelinci yang cepat, dan kura-kura yang lambat. Kata para peneliti, hal ini dikarenakan perbandingan dari bubble sort dilakukan kepada nilai yang tepat berada di sampingnya. Seandainya, perbandingan dilakukan dalam jarak tertentu, kemungkinan hal ini bisa diatasi menjadi lebih baik. Dan hal ini memunculkan algoritma lain, yaitu comb sort.

Well.. untuk hal ini, kita teruskan di tulisan berikutnya aja yah…

1

Bubble Sort Part 1: Teori & Praktik

Berawal dari tulisan ini yang menahun udah ditulis… saya jadi pengen bikin tulisan ini. Dan… melihat tanggal post-nya.. Can you believe it?! I wrote it 5 years ago! God, udah lumayan lama umur ini blog yah berarti. Dengan pengunjung yang ga nambah berarti tiap tahunnya. Bahkan ada yang sempat komentar, tulisan blog balita bertele-tele banget. Bagusnya langsung ke pokok bahasan ajah. Hahahah…

Baiklah, intinya di sini saya mau tulis tentang bubble sort. Tulisan ini sama kayak tulisan yang berserakan di dunia maya, jadi ga ada spesial2nya. Terus kenapa ditulis?! Kenapa ga cantumin sumber aja?! Yaaa… karena saya mau ngisi blog di tahun baru, itu aja… udah. Ga ada alasan lain. O iya, walaupun di sini kita bahasa bubble sort.. one caveat for you… bubble sort ini pengurutan naive ya! Cetek banget! Ilmu kamu rendah kalau pakai pengurutan ini di kasus yang kamu punya. Untuk alasan apapun, walau ini dibahas sama anak kuliahan, jangan gunakan pengurutan ini untuk tugas2 algoritma dasar (bahkan yang lanjut)! Kecuali kamu disuruh dosen/aspraknya. Algoritma ini simple, tapi worst case-nya punya cost yang bisa dibilang ga minimal.

Kita mulai yah… (iya, baru mulai sekarang inti tulisannya). Dimulai dari konsep pengurutan terlebih dahulu. Teori pengurutan atau sorting, sebenarnya diawali dari pertanyaan gini:

kalau kamu punya sebuah data numerik (kita pakai numerik aja yang gampang dibandingkan)… gimana cara membuktikan bahwa dia sudah terurut atau belum??

Itulah konsep awal dari pengurutan. Simple memang, tapi bayangkan kamu musti ngajarin komputer tentang hal ini. Dan ditambahkan satu hal lagi berupa: “Apa yang dilakukan kalau tidak terurut?!” maka jadilah sebuah algoritma pengurutan.

Bubble sort mengambil konsep ini dengan sederhana. Sebuah daftar dinyatakan terurut atau tidak, kalau sebuah nilai yang berdampingan diletakkan dalam urutan yang seharusnya. Artinya apa?? artinya gini… ketika kamu punya 2 nilai, anggaplah a dan b. Kedua hal dalam posisi yang tetap tersusun dalam bentu “a b“. Maka kedua hal tersebut dinyatakan terurut menaik jika a < b; dan terurut menurun jika a > b. Dan sekarang, bayangkan yang kamu punya adalah sebuah daftar, anggaplah dengan 5 nilai: “a b c d e“. Maka, untuk membuktikan bahwa daftar sudah terurut menaik kalau kamu harus bisa membuktikan 4 kondisi:

  1. a < b
  2. b < c
  3. c < d
  4. d < e

Dengan kata lain, untuk setiap nilai yang bersebelahan, harus memenuhi persyaratan tertentu, entah lebih besar, atau lebih kecil. Hal inilah yang diambil oleh bubble sort:

Pastikan dua nilai yang bersebelahan memenuhi kondisi tertentu. Jika tidak, maka lakukan swapped (menukarkan posisi dari 2 nilai). Lakukan pengecekan berulang sampai swapped tidak terjadi lagi mulai dari awal komponen, sampai akhir komponen.

Contoh:

Diketahui sebuah daftar “3 2 7 6”, kondisi tidak terurut. Daftar harus diurutkan menaik menjadi “2 3 6 7” Maka terdapat beberapa hal yang harus kamu lakukan:

  1. Mulai perulangan dari elemen indeks ke i=0 (nilai 3) sampai i=n-1 (nilai 7). Bandingkan antara bilangan ke-i dan setelahnya.
  2. Jika hasil perbandingan lebih besar, maka tukarkan letaknya (hal ini dinamakan swapped).
  3. Jika swapped terjadi, langkah 1 harus dieksekusi kembali sampai swapped tidak terjadi.

Untuk lebih jelasnya, kita buat gambarannya:

Kondisi awal: "3 2 7 6" 
Kondisi akhir: elemen terurut menaik - "2 3 6 7"

First pass

Bandingkan elemen 0 dengan elemen 1
3 2 7 6 --> 2 3 7 6.
Swapped terjadi di elemen 0 & elemen 1

Bandingkan elemen 1 dengan elemen 2
2 3 7 6 --> 2 3 7 6
Swapped tidak terjadi

Bandingkan elemen 2 dengan elemen 3
2 3 7 6 --> 2 3 6 7
Swapped terjadi

Sampai di sini, kondisi awal dengan kondisi akhir sudah sama. Tapi proses sorting belum berhenti. Ingat bahwa perbandingan harus diulang dari elemen ke-0 sampai ke-n jika ada swapped. Dari proses sebelumnya, swapped terjadi di proses 1 juga proses 3, maka lakukan perbandingan kembali dari awal.

Kondisi sebelumnya: "2 3 6 7" 
Kondisi akhir: elemen terurut menaik - "2 3 6 7"

Second pass

Bandingkan elemen 0 dengan elemen 1
2 3 6 7 --> 2 3 6 7.
Swapped tidak terjadi

Bandingkan elemen 1 dengan elemen 2
2 3 6 7 --> 2 3 6 7
Swapped tidak terjadi

Bandingkan elemen 2 dengan elemen 3
2 3 6 7 --> 2 3 6 7
Swapped tidak terjadi

Dan pada second pass di atas, swapped tidak terjadi sama sekali. Dan algoritma pengurutan pun berhenti. Karena kondisi langkah ke-3 tidak lagi terpenuhi. Dan lihat.. tujuan akhir sudah tercapai.

Proses di atas dibagi ke dalam 2 pass dalam block penjelasan yang berbeda… dan buat lengkapnya, gini proses dari bubble sort itu dituliskan:

Kondisi awal: "3 2 7 6" 
Kondisi akhir: elemen terurut menaik - "2 3 6 7"

First pass
3 2 7 6 --> 2 3 7 6 (swapped terjadi)
2 3 7 6 --> 2 3 7 6 (swapped tidak terjadi)
2 3 7 6 --> 2 3 6 7 (swapped terjadi)

Second pass
2 3 6 7 --> 2 3 6 7 (swapped tidak terjadi)
2 3 6 7 --> 2 3 6 7 (swapped tidak terjadi)
2 3 6 7 --> 2 3 6 7 (swapped tidak terjadi)

Algoritma berhenti karena tidak ada swapped.
Kondisi daftar terurut menaik.

Sekarang, kode-nya seperti apa? Kode-nya sendiri dapat kamu cek di sumber di bawah, kalau yang saya bikin, ada di post ini. Kamu bisa coba…

import java.util.Random;

public class NewClass {

    public int[] randomArray(int jumlah) {
        int[] arr = new int[jumlah];
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            arr[i] = r.nextInt(10);
        }
        return arr;
    }

    public int[] urut(int[] arr) {
        int j, temp;
        boolean flag = true;

        while (flag) {
            flag = false;
            for (j = 0; j < arr.length - 1; j++) {
                if (arr[j] > arr[j + 1]){
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }
        }
        return arr;
    }
    public void tampilArray(int[] arr){
        for (int i:arr) {
            System.out.print(i+" ");
        }
    }
    public static void main(String[] args) {
        NewClass nc = new NewClass();
        int[] array = nc.randomArray(6);
        System.out.println("Array: ");
        nc.tampilArray(array);
        System.out.println("\n\nArray Terurut: ");
        int[] arrayUrut = nc.urut(array);
        nc.tampilArray(arrayUrut);
    }
}

Kode di atas untuk terurut menurun. Kalau mau mau terurut menaik, bisa ganti tanda “<” jadi “>” di baris ke-21. Untuk mengganti jumlah nilai yang akan diurutkan, bisa ganti parameter input dari method radomArray di baris ke-38. Begitulah… semoga bisa membantu kamu.

Sumber:

0

Watch “[예λŠ₯μ—°κ΅¬μ†Œ 직캠] κ³¨λ“ μ°¨μΌλ“œ λ„ˆλ§Œ 보인닀 @μ‡Ό!μŒμ•…μ€‘μ‹¬_20181215 I SEE YOU Golden Child in 4K” on YouTube

Dan lagi2 golden child. Lagi seneng aja Ama mereka. Tapi selalu buat lagu yang “side version”. Untuk yang sekarang, konsepnya aga unik buat gw, soalnya yang dikit dapat line buat nyanyi malah jadi double center.

Kalau kamu ga tau center nya siapa, gw sebenernya juga ga tau. Tapi kata para fans c Jaehyun ama Bomin yang jadi center-nya. Jaehyun yang pakai baju “beautiful trauma”, terus kalau Bomin.. ga keliatan. Soalnya ga ikut manggung karena sakit.

Well, whatever it is.. enjoy this child’s performance, guyz.. πŸ˜‰πŸ‘Œ