Abstract Windowing Toolkit
dan Swing
Tanpa mempelajari tentang grapichal user interface (GUI) API, Anda masih tetap bisa
membuat suatu program. Tetapi, program Anda akan kelihatan tidak menarik dan tidak
nyaman digunakan bagi para user. Memiliki GUI yang baik dapat memberi efek pada
penggunaan aplikasi. Java menyediakan banyak tool seperti Abstract Windowing Toolkit dan
Swing untuk mengembangkan aplikasi GUI yang interaktif.
Setelah menyelesaikan bab ini, Anda diharapkan untuk :
1. Memahami persamaan dan perbedaan antara AWT dan Swing
2. Perbedaan antara komponen dan kontainer.
3. Mendesain aplikasi GUI menggunakan AWT.
4. Mendesain aplikasi GUI menggunakan Swing.
5. Menjelaskan tentang flow layout, border layout, dan grid layout dalam komponen GUI
6. Membuat tampilan yang komplek dalam mendesain aplikasi GUI.
7.2 Abstract Windowing Toolkit (AWT) vs. Swing
The Java Foundation Class (JFC), merupakan bagian penting dari Java SDK, yang termasuk
dalam koleksi dari API dimana dapat mempermudah pengembangan aplikasi JAVA GUI. JFC
termasuk diantara 5 bagian utama dari API yaitu AWT dan Swing. Tiga bagian yang lainnya
dari API adalah Java2D, Accessibility, dan Drag dan Drop. Semua itu membantu pengembang
dalam mendesain dan mengimplementasikan aplikasi visual yang lebih baik.
AWT dan Swing menyediakan komponen GUI yang dapat digunakan dalam membuat aplikasi
Java dan applet. Anda akan mempelajari applet pada bab berikutnya. Tidak seperti beberapa
komponen AWT yang menggunakan native code, keseluruhan Swing ditulis menggunakan
bahasa pemrograman Java. Swing menyediakan implementasi platform-independent dimana
aplikasi yang dikembangkan dengan platform yang berbeda dapat memiliki tampilan yang
sama. Begitu juga dengan AWT menjamin tampilan look and feel pada aplikasi yang dijalankan
pada dua mesin yang berbeda menjadi terlihat sama. Swing API dibangun dari beberapa API
yang mengimplementasikan beberapa jenis bagian dari AWT. Kesimpulannya, komponen AWT
dapat digunakan dengan komponen Swing.
Pengenalan Pemrograman 2 1
7.3 Komponen GUI pada AWT
7.3.1 Window Classes Fundamental
Dalam mengembangkan aplikasi GUI, komponen GUI seperti tombol atau textfield diletakkan
di dalam kontainer. Berikut ini adalah daftar dari beberapa kelas penting pada kontainer yang
telah disediakan oleh AWT.
AWT Class Description
Komponen Abstract Class untuk objek yang dapat ditampilkan pada console dan
berinteraksi dengang user. Bagian utama dari semua kelas AWT.
Kontainer Abstract Subclass dari Component Class. Sebuah komponen yang dapat
menampung komponen yang lainnya.
Panel Turunan dari Container Class. Sebuah frame atau window tanpa titlebar,
menubar tidak termasuk border. Superclass dari applet class.
Window Turunan dari Container class. Top level window, dimana berarti tidak bisa
dimasukkan dalam objek yang lainnya.Tidak memiliki border dan menubar.
Frame Turunan dari window class. Window dengan judul, menubar, border dan
pengatur ukuran di pojok. Memiliki empat konstruktor , dua diantaranya
memiliki penulisan seperti dibawah ini :
Frame()
Frame(String title)
Tabel 1.2.1: Kelas kontainer AWT
Untuk mengatur ukuran window, menggunakan metode setSize.void setSize(int width, int height)
mengubah ukuran komponen ini dengan width dan height sebagai parameter.void setSize(Dimension d)
mengubah ukuran dengan d.width dan d.height berdasar pada spesifikasi Dimension d.
Default dari window adalah not visible atau tak tampak hingga Anda mengatur visibility
menjadi true. Inilah syntax untuk metode setVisible.void setVisible(boolean b)
Dalam mendesain aplikasi GUI, Object Frame selalu digunakan. Dibawah ini adalah contoh
bagaimana membuat sebuah aplikasi.
import java.awt.*;
public class SampleFrame extends Frame {
Pengenalan Pemrograman 2 2
public static void main(String args[]) {
SampleFrame sf = new SampleFrame();
sf.setSize(100, 100); //Coba hilangkan baris ini
sf.setVisible(true); //Coba hilangkan baris ini
}
}
perhatikan bahwa tombol tutup pada frame tidak akan bekerja karena tidak ada mekanisme
event handling yang ditambahkan di dalam aplikasi. Anda akan belajar tentang event handling
pada modul selanjutnya.
7.3.2 Grafik
Beberapa metode grafik ditemukan dalam Graphic class. Dibawah ini adalah daftar dari
beberapa metode.
drawLine() drawPolyline() setColor()
fillRect() drawPolygon() getFont()
drawRect() fillPolygon() setFont()
clearRect() getColor() drawString()
Tabel 1.2.2a: Beberapa metode dari kelas Graphics
Hubungan dari kelas ini adalah Color class, dimana memiliki tiga konstruktor.
Constructor Format Description
Color(int r, int g, int b) Nilai integer 0 - 255.
Color(float r, float g, float b) Nilai float 0.0 - 1.0.
Color(int rgbValue) Panjang nilai : 0 ke 224-1 (hitam ke putih).
Red: bits 16-23
Green: bits 8-15
Blue: bits 0-7
Dibawah ini adalah contoh program yang menggunakan beberapa metode di dalam Graphic
class.
import java.awt.*;
public class GraphicPanel extends Panel {
GraphicPanel() {
setBackground(Color.black); //constant in Color class
}
public void paint(Graphics g) {
g.setColor(new Color(0,255,0)); //green
g.setFont(new Font("Helvetica",Font.PLAIN,16));
g.drawString("Hello GUI World!", 30, 100);
g.setColor(new Color(1.0f,0,0)); //red
Pengenalan Pemrograman 2 3
g.fillRect(30, 100, 150, 10);
}
public static void main(String args[]) {
Frame f = new Frame("Testing Graphics Panel");
GraphicPanel gp = new GraphicPanel();
f.add(gp);
f.setSize(600, 300);
f.setVisible(true);
}
}
Agar panel dapat terlihat atau visible, dia harus diletakkan didalam window yang dapat terlihat
seperti sebuah frame.
7.3.3 Beberapa komponen AWT
Berikut ini adalah daftar dari kontrol AWT. Kontrol adalah komponen seperti tombol atau
textfield yang mengijinkan user untuk berinteraksi dengan aplikasi GUI. Berikut ini semua
subkelas dari Components class.
Label Button Choice
TextField Checkbox List
TextArea CheckboxGroup Scrollbar
Tabel 1.2.3: Komponen AWT
Berikut adalah aplikasi membuat sebuah frame dengan kontrol yang telah dimasukkan di
dalamnya.
import java.awt.*;
class FrameWControls extends Frame {
public static void main(String args[]) {
FrameWControls fwc = new FrameWControls();
fwc.setLayout(new FlowLayout()); //more on this later
fwc.setSize(600, 600);
fwc.add(new Button("Test Me!"));
fwc.add(new Label("Labe"));
fwc.add(new TextField());
CheckboxGroup cbg = new CheckboxGroup();
fwc.add(new Checkbox("chk1", cbg, true));
fwc.add(new Checkbox("chk2", cbg, false));
fwc.add(new Checkbox("chk3", cbg, false));
List list = new List(3, false);
list.add("MTV");
list.add("V");
fwc.add(list);
Choice chooser = new Choice();
chooser.add("Avril");
chooser.add("Monica");
Pengenalan Pemrograman 2 4
chooser.add("Britney");
fwc.add(chooser);
fwc.add(new Scrollbar());
fwc.setVisible(true);
}
}
7.4 Layout Manager
Posisi dan ukuran suatu komponen ditentukan oleh layout manager. Layout manager
mengatur tampilan dari komponen di dalam kontainer. Berikut ini beberapa layout manager
yang terdapat di dalam Java.
1.FlowLayout
2.BorderLayout
3.GridLayout
4.GridBagLayout
5.CardLayout
Layout manager dapat diatur menggunakan metode setLayout dari Container class. Metode ini
dapat ditulis sebagai berikut.
void setLayout(LayoutManager mgr)
Jika Anda memilih untuk tidak menggunakan layout manager, Anda dapat mengisi null sebagai
argumen untuk metode ini. Tetapi selanjutnya, Anda akan mengatur posisi elemen secara
manual dengan menggunakan metode setBounds dari Components class.
public void setBounds(int x, int y, int width, int height)
Metode ini mengatur posisi berdasarkan pada argumen x dan y, dan ukuran berdasarkan
argumen width dan height. Hal ini akan cukup menyulitkan dan membosankan untuk aplikasi
jika Anda memiliki beberapa objek komponen didalam objek kontainer. Anda akan memanggil
metode ini untuk setiap komponen.
7.4.1 FlowLayout Manager
FlowLayout Manager adalah default manager untuk Panel class dan subkelasnya, termasuk
applet class. Cara meletakkan komponen dari FlowLayout Manager dimulai dari kiri ke kanan
dan dari atas ke bawah, dimulai dari pojok kiri atas. Seperti pada saat Anda mengetik
menggunakan editor kata pada umumnya. Berikut adalah bagaimana FlowLayout Manager
bekerja, dimana memiliki tiga konstruktor seperti daftar di bawah ini.
FlowLayout Constructors
FlowLayout()
Membuat objek baru FlowLayout dengan posisi di tengah dan lima unit horizontal dan vertikal
gap dimasukkan pada komponen sebagai default.
FlowLayout(int align)
Pengenalan Pemrograman 2 5
FlowLayout Constructors
Membuat objek baru FlowLayout dengan posisi spesifik dan lima unit horizontal dan vertikal
gap dimasukkan pada komponen sebagai default.
FlowLayout(int align, int hgap, int vgap)
Membuat objek baru FlowLayout dengan argumen pertama sebagai posisi pada komponen
dan hgap untuk horizontal dan vgap untuk vertikal pada komponen
Tabel 1.3.1: Konstruktor FlowLayout
Gap dapat dikatakan sebagai jarak antara komponen dan biasanya diukur dengan satuan
pixel. Posisi argumen mengikuti penulisan sebagai berikut :
1.FlowLayout.LEFT
2.FlowLayout.CENTER
3.FlowLayout.RIGHT
Bagaimanakah output dari program berikut?
import java.awt.*;
class FlowLayoutDemo extends Frame {
public static void main(String args[]) {
FlowLayoutDemo fld = new FlowLayoutDemo();
fld.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
fld.add(new Button("ONE"));
fld.add(new Button("TWO"));
fld.add(new Button("THREE"));
fld.setSize(100, 100);
fld.setVisible(true);
}
}
Gambar berikut adalah contoh dari hasil yang berjalan pada platform Window.
Tabel 13.1: Contoh hasil dalam window
Pengenalan Pemrograman 2 6
7.4.2.BorderLayout Manager
BorderLayout membagi kontainer menjadi lima bagian diantaranya utara, selatan, timur,
barat, dan tengah. Setiap komponen dimasukkan ke dalam region yang spesifik. Region utara
dan selatan membentuk jalur horizontal sedangkan region timur dan barat membentuk jalur
vertikal. Dan region tengah berada pada perpotongan jalur horizontal dan vertikal. Tampilan
ini adalah bersifat default untuk objek Window, termasuk objek dari subkelas Window yaitu
tipe Frame dan Dialog.
Konstruktor BorderLayout
BorderLayout()
Membuat objek BorderLayout baru tanpa spasi yang diaplikasikan diantara komponen yang
berbeda.
BorderLayout(int hgap, int vgap)
Membuat objek BorderLayout baru dengan spasi unit hgap horizontal dan unit vgap vertikal
yang diaplikasikan diantara komponen yang berbeda.
Tabel 1.3.2: Konstruktor BorderLayout
Seperti pada FlowLayout Manager, parameter hgap dan vgap disini juga menjelaskan jarak
antara komponen dengan kontainer.
Untuk menambahkan komponen kedalam region yang spesifik, gunakan metode
menambahkan dan melewatkan dua argumen yaitu : komponen yang ingin dimasukkan ke
dalam region dan region mana yang ingin dipakai untuk meletakkan komponen. Perlu
diperhatikan bahwa hanya satu komponen yang dapat dimasukkan dalam satu region.
Menambahkan lebih dari satu komponen pada kontainer yang bersangkutan, maka komponen
yang terakhir ditambahkan yang akan ditampilkan. Berikut ini adalah daftar dari kelima region.
1. BorderLayout.NORTH
2. BorderLayout.SOUTH
3. BorderLayout.EAST
4. BorderLayout.WEST
5. BorderLayout.CENTER
Berikut ini adalah contoh program yang menunjukkan bagaimana BorderLayout bekerja.
import java.awt.*;
class BorderLayoutDemo extends Frame {
public static void main(String args[]) {
BorderLayoutDemo bld = new BorderLayoutDemo();
bld.setLayout(new BorderLayout(10, 10)); //may remove
bld.add(new Button("NORTH"), BorderLayout.NORTH);
bld.add(new Button("SOUTH"), BorderLayout.SOUTH);
bld.add(new Button("EAST"), BorderLayout.EAST);
bld.add(new Button("WEST"), BorderLayout.WEST);
bld.add(new Button("CENTER"), BorderLayout.CENTER);
bld.setSize(200, 200);
bld.setVisible(true);
Pengenalan Pemrograman 2 7
}
}
Berikut ini adalah hasil dari contoh program tersebut. Gambar kedua menunjukkan efek dari
mengubah bentuk dari frame.
Gambar 1.3.2: hasil contoh program
7.4.3 GridLayout Manager
Dengan GridLayout manager, komponen juga diposisikan dari kiri ke kanan dan dari atas ke
bawah seperti pada FlowLayout manager. GridLayout manager membagi kontainer menjadi
baris dan kolom. Semua region memiliki ukuran yang sama. Hal tersebut tidak mempedulikan
ukuran sebenarnya dari komponen.
Berikut ini adalah daftar dari konstruktor untuk GridLayout class.
Konstruktor GridLayout
GridLayout()
Membuat objek GridLayout baru dengan satu baris dan satu kolom sebagai default
GridLayout(int rows, int cols)
Membuat objek GridLayout baru dengan jumlah baris dan kolom sesuai dengan keinginan
GridLayout(int rows, int cols, int hgap, int vgap)
Membuat objek GridLayout baru dengan jumlah baris dan kolom yang ditentukan. Unit spasi
hgap horizontal dan vgap vertikal diaplikasikan ke dalam komponen.
Tabel 1.3.3: Konstruktor GridLayout
Cobalah program ini.
import java.awt.*;
class GridLayoutDemo extends Frame {
public static void main(String args[]) {
GridLayoutDemo gld = new GridLayoutDemo();
Pengenalan Pemrograman 2 8
gld.setLayout(new GridLayout(2, 3, 4, 4));
gld.add(new Button("ONE"));
gld.add(new Button("TWO"));
gld.add(new Button("THREE"));
gld.add(new Button("FOUR"));
gld.add(new Button("FIVE"));
gld.setSize(200, 200);
gld.setVisible(true);
}
}
Berikut ini adalah hasil dari program.
Gambar 1.3.3: hasil contoh program
7.4.4 Panel dan Tampilan kompleks
Untuk membuat tampilan yang lebih komplek, Anda dapat menggabungkan layout manager
yang berbeda dengan menggunakan panel. Ingatlah bahwa panel adalah kontainer dan
komponen pada saat yang sama. Anda dapat memasukkan komponen ke dalam panel dan
kemudian menambahkan panel ke dalam region yang Anda inginkan di dalam kontainer.
Pengenalan Pemrograman 2 9
Perhatikan teknik yang digunakan pada contoh berikut.
import java.awt.*;
class ComplexLayout extends Frame {
public static void main(String args[]) {
ComplexLayout cl = new ComplexLayout();
Panel panelNorth = new Panel();
Panel panelCenter = new Panel();
Panel panelSouth = new Panel();
/* North Panel */
//Panels use FlowLayout by default
panelNorth.add(new Button("ONE"));
panelNorth.add(new Button("TWO"));
panelNorth.add(new Button("THREE"));
/* Center Panel */
panelCenter.setLayout(new GridLayout(4,4));
panelCenter.add(new TextField("1st"));
panelCenter.add(new TextField("2nd"));
panelCenter.add(new TextField("3rd"));
panelCenter.add(new TextField("4th"));
/* South Panel */
panelSouth.setLayout(new BorderLayout());
panelSouth.add(new Checkbox("Choose me!"),
BorderLayout.CENTER);
panelSouth.add(new Checkbox("I'm here!"),
BorderLayout.EAST);
panelSouth.add(new Checkbox("Pick me!"),
BorderLayout.WEST);
/* Adding the Panels to the Frame container */
//Frames use BorderLayout by default
cl.add(panelNorth, BorderLayout.NORTH);
cl.add(panelCenter, BorderLayout.CENTER);
cl.add(panelSouth, BorderLayout.SOUTH);
cl.setSize(300,300);
cl.setVisible(true);
}
}
Pengenalan Pemrograman 2 10
Berikut ini adalah hasil dari program.
Gambar 1.3.4: Hasil dari contoh program
7.5 Komponen Swing
Seperti pada package AWT, package dari Swing menyediakan banyak kelas untuk membuat
aplikasi GUI. Package tersebut dapat ditemukan di javax.swing. Perbedaan utama antara
keduanya adalah komponen Swing ditulis menyeluruh menggunakan Java mengingat yang
belakangan tidak. Kesimpulannya, program GUI ditulis menggunakan banyak kelas dari
package Swing yang mempunyai tampilan look and feel yang sama meski dijalankan pada
beda paltform. Lebih dari itu, Swing menyediakan komponen yang lebih menarik seperti color
chooser dan option pane.
Nama dari komponen GUI milik Swing hampir sama persis dengan komponen GUI milik AWT.
Perbedaan jelas terdapat pada penamaan komponen. Pada dasarnya, nama komponen Swing
sama dengan nama komponen AWT tetapi dengan tambahan huruf J pada prefixnya. Sebagai
contoh, satu komponen dalam AWT adalah button class. Sedangkan pada Swing, nama
komponen tersebut menjadi Jbutton class. Berikut adalah daftar dari komponen Swing.
Komponen
Swing
Penjelasan
JComponent Kelas induk untuk semua komponen Swing, tidak termasuk top-level
kontainer
JButton Tombol “push”. Korespondesi pada button class dalam package AWT
JCheckBox Item yang dapat dipilih atau tidak oleh pengguna. Korespondensi pada
checkbox class dalam package AWT
Pengenalan Pemrograman 2 11
Komponen
Swing
Penjelasan
JFileChooser Mengijinkan pengguna untuk memilih sebuah file. Korespondensi pada
filechooser class dalam package AWT
JTextField Mengijinkan untuk mengedit text satu baris. Korespondensi pada textfield
class dalam package AWT.
JFrame Turunan dan korepondensi pada frame class dalam package AWT tetapi
keduanya sedikit tidak cocok dalam kaitannya dengan menambahkan
komponen pada kontainer. Perlu mendapatkan content pane yang terbaru
sebelum menambah sebuah komponen.
JPanel Turunan Jcomponent. Kontainer class sederhana tetapi bukan top-level.
Korespondensi pada panel class dalam package AWT.
JApplet Turunan dan korepondensi ke Applet class dalam package AWT. Juga sedikit
tidak cocok dengan applet class dalam kaitannya dengan menambahkan
komponen pada kontainer
JOptionPane Turunan Jcomponent. Disediakan untuk mempermudah menampilkan pop-
up kotak dialog.
JDialog Turunan dan korespondensi pada dialog class dalam package AWT. Biasanya
digunakan untuk menginformasikan sesuatu kepada pengguna atau prompt
pengguna untuk input.
JColorChooser Turunan Jcomponent. Mengijinkan pengguna untuk memilih warna
Tabel 1.4: Beberapa komponen Swing
Untuk daftar yang lengkap dari komponen Swing, Anda dapat melihatnya di dokumentasi API.
7.5.1 Setting Up Top-Level Containers
Seperti disebutkan diatas, top-level containers seperti Jframe dan Japplet dalam Swing sangat
tidak cocok dengan AWT. Ini adalah syarat menambahkan komponen ke dalam kontainer. Jika
Anda ingin menambahkan langsung sebuah komponen kedalam kontainer sebagai kontainer
AWT, pertama-tama Anda telah mendapatkan content pane dari kontainer. Untuk melakukan
hal tersebut, Anda akan menggunakan metode getContentPane dari kontainer.
7.5.2 Contoh Jframe
import javax.swing.*;
import java.awt.*;
class SwingDemo {
JFrame frame;
JPanel panel;
JTextField textField;
JButton button;
Container contentPane;
void launchFrame() {
Pengenalan Pemrograman 2 12
/* initialization */
frame = new JFrame("My First Swing Application");
panel = new JPanel();
textField = new JTextField("Default text");
button = new JButton("Click me!");
contentPane = frame.getContentPane();
/* add components to panel– uses FlowLayout by default */
panel.add(textField);
panel.add(button);
/* add components to contentPane– uses BorderLayout */
contentPane.add(panel, BorderLayout.CENTER);
frame.pack();
//causes size of frame to be based on the components
frame.setVisible(true);
}
public static void main(String args[]) {
SwingDemo sd = new SwingDemo();
sd.launchFrame();
}
}
Perlu diperhatikan pada package java.awt masih saja diimpor karena layout manager yang
digunakan terdapat pada package tersebut. Juga, memberi judul pada frame dan mengepack
komponen di dalam frame dapat juga dilakukan untuk frame AWT.
Petunjuk penulisan program:
Perhatikan penulisan kode yang digunakan pada contoh ini tampak berlawanan dengan
contoh untuk AWT. Komponen dideklarasikan sebagai fields, metode launchFrame ditentukan,
dinisialisasikan dan penambahan semua komponen dilaksanakan di dalam metode
launchFrame. Kita tidak lagi meng-extend Frame class. Keuntungan penggunaan gaya ini
akan lebih berguna ketika sampai pada event handling.
Berikut adalah keluaran dari program diatas.
Gambar 1.4.2: Hasil contoh program
7.5.3 Contoh JOptionPane
import javax.swing.*;
class JOptionPaneDemo {
JOptionPane optionPane;
void launchFrame() {
optionPane = new JOptionPane();
String name = optionPane.showInputDialog("Hi, what's your
name?");
optionPane.showMessageDialog(null,
"Nice to meet you, " + name + ".", "Greeting...",
optionPane.PLAIN_MESSAGE);
Pengenalan Pemrograman 2 13
System.exit(0);
}
public static void main(String args[]) {
new JOptionPaneDemo().launchFrame();
}
}
Lihat, begitu mudahnya memasukkan input dari user.
Berikut ini adalah hasil dari contoh program diatas
Gambar 1.4.3: Hasil contoh program
Bab 6
Algoritma Sorting
6.1 Tujuan
Sorting adalah proses menyusun elemen – elemen dengan tata urut tertentu dan
proses tersebut terimplementasi dalam bermacam aplikasi. Kita ambil contoh pada
aplikasi perbankan. Aplikasi tersebut mampu menampilkan daftar account yang aktif.
Hampir seluruh pengguna pada sistem akan memilih tampilan daftar berurutan
secara ascending demi kenyamanan dalam penelusuran data.
Beberapa macam algoritma sorting telah dibuat karena proses tersebut sangat
mendasar dan sering digunakan. Oleh karena itu, pemahaman atas algoritma –
algoritma yang ada sangatlah berguna.
Setelah menyelesaikan pembahasan pada bagian ini, anda diharapkan mampu :
1. Memahami dan menjelaskan algoritma dari insertion sort, selection sort,
merge sort dan quick sort.
2. Membuat implementasi pribadi menggunakan algoritma yang ada
6.2 Insertion Sort
Salah satu algoritma sorting yang paling sederhana adalah insertion sort. Ide dari
algoritma ini dapat dianalogikan seperti mengurutkan kartu. Penjelasan berikut ini
menerangkan bagaimana algoritma insertion sort bekerja dalam pengurutan kartu.
Anggaplah anda ingin mengurutkan satu set kartu dari kartu yang bernilai paling
kecil hingga yang paling besar. Seluruh kartu diletakkan pada meja, sebutlah meja
ini sebagai meja pertama, disusun dari kiri ke kanan dan atas ke bawah. Kemudian
kita mempunyai meja yang lain, meja kedua, dimana kartu yang diurutkan akan
diletakkan. Ambil kartu pertama yang terletak pada pojok kiri atas meja pertama
dan letakkan pada meja kedua. Ambil kartu kedua dari meja pertama, bandingkan
dengan kartu yang berada pada meja kedua, kemudian letakkan pada urutan yang
sesuai setelah perbandingan. Proses tersebut akan berlangsung hingga seluruh kartu
pada meja pertama telah diletakkan berurutan pada meja kedua.
Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi
dua bagian, yang belum diurutkan (meja pertama) dan yang sudah diurutkan (meja
kedua). Elemen pertama diambil dari bagian array yang belum diurutkan dan
kemudian diletakkan sesuai posisinya pada bagian lain dari array yang telah
diurutkan. Langkah ini dilakukan secara berulang hingga tidak ada lagi elemen yang
tersisa pada bagian array yang belum diurutkan.
Pengenalan Pemrograman 2 1
6.2.1Algoritma
void insertionSort(Object array[], int startIdx, int endIdx) {
for (int i = startIdx; i < endIdx; i++) {
int k = i;
for (int j = i + 1; j < endIdx; j++) {
if (((Comparable) array[k]).compareTo(array[j])>0) {
k = j;
}
}
swap(array[i],array[k]);
}
}
6.2.2Sebuah Contoh
Data
Mango
Apple
Peach
Orange
Banana
1st Pass
Mango
Apple
Peach
Orange
Banana
2nd Pass
Apple
Mango
Peach
Orange
Banana
3rd Pass
Apple
Mango
Orange
Peach
Banana
4th Pass
Apple
Banana
Mango
Orange
Peach
Gambar 1.1.2: Contoh insertion sort
Pada akhir modul ini, anda akan diminta untuk membuat implementasi bermacam
algoritma sorting yang akan dibahas pada bagian ini.
6.3 Selection Sort
Jika anda diminta untuk membuat algoritma sorting tersendiri, anda mungkin akan
menemukan sebuah algoritma yang mirip dengan selection sort. Layaknya insertion
sort, algoritma ini sangat rapat dan mudah untuk diimplementasikan.
Mari kita kembali menelusuri bagaimana algoritma ini berfungsi terhadap satu paket
kartu. Asumsikan bahwa kartu tersebut akan diurutkan secara ascending. Pada
awalnya, kartu tersebut akan disusun secara linier pada sebuah meja dari kiri ke
kanan, dan dari atas ke bawah. Pilih nilai kartu yang paling rendah, kemudian
tukarkan posisi kartu ini dengan kartu yang terletak pada pojok kiri atas meja. Lalu
cari kartu dengan nilai paling rendah diantara sisa kartu yang tersedia. Tukarkan
kartu yang baru saja terpilih dengan kartu pada posisi kedua. Ulangi langkah –
langkah tersebut hingga posisi kedua sebelum posisi terakhir dibandingkan dan
dapat digeser dengan kartu yang bernilai lebih rendah.
Pengenalan Pemrograman 2 2
Ide utama dari algoritma selection sort adalah memilih elemen dengan nilai paling
rendah dan menukar elemen yang terpilih dengan elemen ke-i. Nilai dari i dimulai
dari 1 ke n, dimana n adalah jumlah total elemen dikurangi 1.
6.3.1Algoritma
void selectionSort(Object array[], int startIdx, int endIdx) {
int min;
for (int i = startIdx; i < endIdx; i++) {
min = i;
for (int j = i + 1; j < endIdx; j++) {
if (((Comparable)array[min]).compareTo(array[j])>0) {
min = j;
}
}
swap(array[min], array[i]);
}
}
6.3.2Sebuah Contoh
Data
Maricar
Vanessa
Margaux
Hannah
Rowena
1st Pass
Hannah
Vanessa
Margaux
Maricar
Rowena
2nd Pass
Hannah
Margaux
Vanessa
Maricar
Rowena
3rd Pass
Hannah
Margaux
Maricar
Vanessa
Rowena
4th Pass
Hannah
Margaux
Maricar
Rowena
Vanessa
Figure 1.2.2: Contoh selection sort
6.4 Merge Sort
Sebelum mendalami algoritma merge sort, mari kita mengetahui garis besar dari
konsep divide and conquer karena merge sort mengadaptasi pola tersebut.
6.4.1Pola Divide and Conquer
Beberapa algoritma mengimplementasikan konsep rekursi untuk menyelesaikan
permasalahan. Permasalahan utama kemudian dipecah menjadi sub-masalah,
kemudian solusi dari sub-masalah akan membimbing menuju solusi permasalahan
utama.
Pengenalan Pemrograman 2 3
Pada setiap tingkatan rekursi, pola tersebut terdiri atas 3 langkah.
1. Divide
Memilah masalah menjadi sub masalah
2. Conquer
Selesaikan sub masalah tersebut secara rekursif. Jika sub-masalah tersebut
cukup ringkas dan sederhana, pendekatan penyelesaian secara langsung akan
lebih efektif
3. Kombinasi
Mengkombinasikan solusi dari sub-masalah, yang akan membimbing menuju
penyelesaian atas permasalahan utama
6.4.2Memahami Merge Sort
Seperti yang telah dijelaskan sebelumnya, Merge sort menggunakan pola divide and
conquer. Dengan hal ini deskripsi dari algoritma dirumuskan dalam 3 langkah
berpola divide-and-conquer. Berikut menjelaskan langkah kerja dari Merge sort.
1. Divide
Memilah elemen – elemen dari rangkaian data menjadi dua bagian.
2. Conquer
Conquer setiap bagian dengan memanggil prosedur merge sort secara
rekursif
3. Kombinasi
Mengkombinasikan dua bagian tersebut secara rekursif untuk mendapatkan
rangkaian data berurutan
Proses rekursi berhenti jika mencapai elemen dasar. Hal ini terjadi bilamana bagian
yang akan diurutkan menyisakan tepat satu elemen. Sisa pengurutan satu elemen
tersebut menandakan bahwa bagian tersebut telah terurut sesuai rangkaian.
6.4.3Algoritma
void mergeSort(Object array[], int startIdx, int endIdx) {
if (array.length != 1) {
//Membagi rangkaian data, rightArr dan leftArr
mergeSort(leftArr, startIdx, midIdx);
mergeSort(rightArr, midIdx+1, endIdx);
combine(leftArr, rightArr);
}
}
Pengenalan Pemrograman 2 4
6.4.4Sebuah Contoh
Rangkaian data:
7 2 5 6
Membagi rangkaian menjadi dua bagian:
LeftArr RightArr
27 27 65 65
Membagi LeftArr menjadi dua bagian:
LeftArr RightArr
77 22
Mengkombinasikan
2 7
Membagi RightArr menjadi dua bagian:
LeftArr RightArr
Mengkombinasikan
5 6
Mengkombinasikan LeftArr dan RightArr.
2 5 6 7
Gambar 1.3.4: Contoh merge sort
6.5 Quicksort
Quicksort ditemukan oleh C.A.R Hoare. Seperti pada merge sort, algoritma ini juga
berdasar pada pola divide-and-conquer. Berbeda dengan merge sort, algoritma ini
hanya mengikuti langkah – langkah sebagai berikut :
1. Divide
Memilah rangkaian data menjadi dua sub-rangkaian A[p…q-1] dan A[q+1…r]
dimana setiap elemen A[p…q-1] adalah kurang dari atau sama dengan A[q]
dan setiap elemen pada A[q+1…r] adalah lebih besar atau sama dengan
elemen pada A[q]. A[q] disebut sebagai elemen pivot. Perhitungan pada
elemen q merupakan salah satu bagian dari prosedur pemisahan.
Pengenalan Pemrograman 2 5
2. Conquer
Mengurutkan elemen pada sub-rangkaian secara rekursif
Pada algoritma quicksort, langkah ”kombinasi” tidak di lakukan karena telah terjadi
pengurutan elemen – elemen pada sub-array
6.5.1Algoritma
void quickSort(Object array[], int leftIdx, int rightIdx) {
int pivotIdx;
/* Kondisi Terminasi */
if (rightIdx > leftIdx) {
pivotIdx = partition(array, leftIdx, rightIdx);
quickSort(array, leftIdx, pivotIdx-1);
quickSort(array, pivotIdx+1, rightIdx);
}
}
6.5.2Sebuah Contoh
Rangkaian data:
3 1 4 1 5 9 2 6 5 3 5 8
Pilih sebuah elemen yang akan menjadi elemen pivot.
3 1 4 1 5 9 2 6 5 3 5 8
Inisialisasi elemen kiri sebagai elemen kedua dan elemen kanan sebagai elemen
akhir.
kiri kanan
3 1 4 1 5 9 2 6 5 3 5 8
Geser elemen kiri kearah kanan sampai ditemukan nilai yang lebih besar dari elemen
pivot tersebut. Geser elemen kanan ke arah kiri sampai ditemukan nilai dari elemen
yang tidak lebih besar dari elemen tersebut.
kiri kanan
3 1 4 1 5 9 2 6 5 3 5 8
Tukarkan antara elemen kiri dan kanan
kiri kanan
Pengenalan Pemrograman 2 6
3 1 3 1 5 9 2 6 5 4 5 8
Geserkan lagi elemen kiri dan kanan.
kiri kanan
3 1 3 1 5 9 2 6 5 4 5 8
Tukarkan antar elemen kembali.
kiri kanan
3 1 3 1 2 9 5 6 5 4 5 8
Geserkan kembali elemen kiri dan kanan.
kanan kiri
3 1 3 1 2 9 5 6 5 4 5 8
Terlihat bahwa titik kanan dan kiri telah digeser sehingga mendapatkan nilai elemen
kanan < elemen kiri. Dalam hal ini tukarkan elemen pivot dengan elemen kanan.
pivot
2 1 3 1 3 9 5 6 5 4 5 8
Gambar 1.4.2: Contoh quicksort
Kemudian urutkan elemen sub-rangkaian pada setiap sisi dari elemen pivot.
6.6 Latihan
6.6.1Insertion Sort
Impelementasikan algoritma insertion sort dalam Java untuk mengurutkan
serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda
terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command
line.
Pengenalan Pemrograman 2 7
6.6.2Selection Sort
Impelementasikan algoritma selection sort dalam Java untuk mengurutkan
serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda
terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command
line.
6.6.3Merge Sort
Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer.
class MergeSort {
static void mergeSort(int array[], int startIdx,
int endIdx) {
if(startIdx == _____) {
return;
}
int length = endIdx-startIdx+1;
int mid = _____;
mergeSort(array, _____, mid);
mergeSort(array, _____, endIdx);
int working[] = new int[length];
for(int i = 0; i < length; i++) {
working[i] = array[startIdx+i];
}
int m1 = 0;
int m2 = mid-startIdx+1;
for(int i = 0; i < length; i++) {
if(m2 <= endIdx-startIdx) {
if(m1 <= mid-startIdx) {
if(working[m1] > working[m2]) {
array[i+startIdx] = working[m2++];
} else {
array[i+startIdx] = _____;
}
} else {
array[i+startIdx] = _____;
}
} else {
array[_____] = working[m1++];
}
}
}
public static void main(String args[]) {
int numArr[] = new int[args.length];
for (int i = 0; i < args.length; i++) {
numArr[i] = Integer.parseInt(args[i]);
}
mergeSort(numArr, 0, numArr.length-1);
for (int i = 0; i < numArr.length; i++) {
System.out.println(numArr[i]);
}
}
}
Pengenalan Pemrograman 2 8
6.6.4 Quicksort
Gunakan implementasi quicksort berikut ini terhadap serangkaian data integer.
class QuickSort {
static void quickSort (int[] array, int startIdx,
int endIdx) {
// startIdx adalah index bawah
// endIdx is index atas
// dari array yang akan diurutkan
int i=startIdx, j=endIdx, h;
//pilih elemen pertama sebagai pivot
int pivot=array[_____];
// memilah
do {
while (array[i]_____pivot) {
i++;
}
while (array[j]>_____) {
j--;
}
if (i<=j) {
h=_____;
array[i]=_____;
array[j]=_____;
i++;
j--;
}
} while (i<=j);
// rekursi
if (startIdx<j) {
quickSort(array, _____, j);
}
if (i<endIdx) {
quickSort(array, _____, endIdx);
}
}
public static void main(String args[]) {
int numArr[] = new int[args.length];
for (int i = 0; i < args.length; i++) {
numArr[i] = Integer.parseInt(args[i]);
}
quickSort(numArr, 0, numArr.length-1);
for (int i = 0; i < numArr.length; i++) {
System.out.println(numArr[i]);
}
}
}