PENGURUTAN DATA
2.1 Definisi Pengurutan Pengurutan (sorting) adalah proses mengatur sekumpulan objek menurut urutan atau susunan tertentu. Urutan objek tersebut dapat menaik (ascending) atau menurun (descending). Bila N buah objek (data) disimpan dalam larik L, maka pengurutan menaik berarti menyusun elemen larik sedemikian sehingga : L[1]≤ L[2]≤ L[3] ≤ ….. ≤ L[N] Sedangkan pengurutan menurun berarti menyusun elemen larik sedemikian sehingga: L[1]≥ L[2] ≥ L[3] ≥ ….. ≥ L[N] Data yang diurut dapat berupa data yang bertipe dasar atau tipe terstruktur (record). Jika data bertipe terstruktur, maka harus dispesifikasikan berdasarkan field apa data tersebut diurutkan. Field yang dijadikan dasar pengurutan dikenal sebagai field kunci. Contoh : Di bawah ini diberikan beberapa contoh data yang terurut : a. 23, 27, 45, 67, 100, 130, 501 (data bertipe integer terurut menaik) b. 50, 27, 21.009, 20.3, 19.0, -5.2, -10.9 (data bertipe riil terurut menurun) c. ‘Amir’’Badu’’Budi’’Dudi’’Zamzani’ (data bertipe string terurut menaik) d. ‘d’,’e’,’g’,’i’,’x’ (data bertipe karakter terurut menaik)
2.2 Metode-metode Pengurutan Adanya kebutuhan terhadap proses pengurutan memunculkan bermacammacam metode pengurutan. Banyak metode pengurutan yang telah ditemukan. Hal ini menunjukkan bahwa persoalan yang kaya dengan solusi algoritmik. Metode pengurutan yang ditemukan dalam literatur komputer antara lain : 1. Metode Pengurutan Gelembung (Bubble Sort) 1
2. Metode Pengurutan Pilih (Selection Sort) 3. Metode Pengurutan Sisip (Insertion Sort) 4. Metode Pengurutan Shell 5. Metode Pengurutan Quick 6. Metode Pengurutan Merge 7. Metode Pengurutan Radix 8. Metode Pengurutan Tree
2.2.1
Metoda Pengurutan Gelembung Metode pengurutan gelembung (bubble sort) diinspirasi oleh gelembung
sabun yang berada di atas permukaan air. Karena berat jenis gelembung asbun lebih ringan daripada berat jenis air, maka gelembung sabun selalu terapung ke atas permukaan. Secara umum, benda-benda yang berat akan terbenam dan bendabenda yang ringan akan terapung. Prinsip pengapungan tersebut yang digunakan pada metode pengurutan gelembung. Apabila kita menginginkan larik terurut menaik, maka elemen yang nilainya paling kecil “diapungkan”, artinya dipindahkan ke ujung larik melalui proses pertukaran. Proses pengapungan dilakukan sebanyak N-1 langkah (satu langkah disebut juga satu kali pass) dengan N adalah ukuran larik. Pada akhir setiap langkah ke-I , larik L[1-N] akan terbagi atas dua bagian yaitu bagian yang sudah terurut dan yang belum terurut. Setelah langkah terakhir diperoleh larik L[1-N] yang sudah terurut menaik.
Algoritma Pengurutan gelembung {Untuk larik yang terurut menaik} 1. input N jumlah data 2. untuk pass = 1, 2, …. N-1 set maks := A[K] untuk K = 1, 2, …. N jika maks < A[K] maka maks := A[K] tukar posisi 2
3. selesai rincian setiap pass adalah : pass 1 :
Mulai dari elemen K = N, N-1, …2, bandingkan L[K] dengan L[K1]. Jika L[K]
pass 1 :
Mulai dari elemen K = N, N-1, …3, bandingkan L[K] dengan L[K1]. Jika L[K]
pass N-1 :
Mulai dari elemen K = N, bandingkan L[K] dengan L[K-1]. Jika L[K]
Pada akhir langkah N –1, elemen L[N-1] berisi nilai minimum ke-(N-1) an larik L[1..N-1] terurut menaik (elemen yang tersisa adalah L[N], tidak perlu diurut karena hanya satu-satunya).
Contoh: Tinjau laruk L dengan N=6 buah elemen yang belum terurut. Larik ini akan diurut menaik. 25
27
1
10 2
8 3
76 4
5
21 6
pass 1: K
Elemen yang dibandingkan
Pertukarkan
Hasil Sementara
K=6
L[6]
Ya
25,27,10,8,21,76
K=5
L[5]
Tidak
25,27,10,8,21,76
K=4
L[4]
Ya
25,27,8,10,21,76
K=3
L[3]
Ya
25,8,27,10,21,76
K=2
L[2]
Ya
8,25,27,10,21,76
Hasil akhir pass 1 8
25 1
27 2
10 3
21 4
5
76 6
pass 2: 3
K
Elemen yang dibandingkan
Pertukarkan
Hasil Sementara
K=6
L[6]
Tidak
8,25,27,10,21,76
K=5
L[5]
Tidak
8,25,27,10,21,76
K=4
L[4]
Ya
8,25,10,27,21,76
K=3
L[3]
Ya
8,10,25,27,21,76
Hasil akhir pass 2 8
10 1
25 2
27 3
21 4
76
5
6
pass 3: K
Elemen yang dibandingkan
Pertukarkan
Hasil Sementara
K=6
L[6]
Tidak
8,10,25,27,21,76
K=5
L[5]
Ya
8,10,25,21,27,76
K=4
L[4]
Ya
8,10,21,25,27,76
Hasil akhir pass 2 8
10 1
21 2
25 3
27 4
76
5
6
pass 4: K
Elemen yang dibandingkan
Pertukarkan
Hasil Sementara
K=6
L[6]
Tidak
8,10,21,25,27,76
K=5
L[5]
Tidak
8,10,21,25,27,76
Hasil akhir pass 4 8
10 1
21 2
25 3
27 4
76
5
6
pass 5: K K=6
Elemen yang dibandingkan
Pertukarkan
Hasil Sementara
Tidak
8,10,21,25,27,76
L[6]
Hasil akhir pass 5 8
10 1
21 2
25 3
27 4
5
76 6 4
tersisa satu elemen (yaitu 76), maka pengurutan selesai. Larik L sudah terurut menaik. Untuk memperoleh larik yang terurut menurun, kita melakukan proses sebaliknya, yaitu “melemparkan” elemen yang berharga maksimum ke”atas” (atau ke ujung “kiri” larik). Pengurutan gelembung merupakan metode pengurutan yang tidak efisien karena banyaknya langkah yang dilakukan pada setiap langkah pengapungan. Untuk ukuran larik yang besar, pengurutan dengan metode ini membutuhkan waktu yang lama.
2.2.2 Metode Pengurutan Pilih Metode ini disebut pengurutan pilih karena gagasan dasarnya adalah memilih elemen maksimum/minimum dari larik, lalu menempatkan elemen tersebut pada awal/akhir larik (elemen terujung). Selanjutnya elemen tersebut “diisolasi” dan tidak disertakan pada proses selanjutnya. Proses yang sama diulang pada larik yang tersisa.
Algoritma Pengurutan Pilih Maksimum Algoritma pengurutan pilih maksimum yaitu memilih elemen maksimum sebagai basis pengurutan. Untuk mendapatkan larik yang terurut menaik. Secara umum algoritma pengurutan pilih maksimum ditulis sebagai berikut : 1. jumlah pass = N-1 2. Untuk setiap I = 1, 2, … pass 2.1
cari elemen terbesar (maks) mulai dari elemen ke-1 sampai elemen ke-N
2.2
pertukarkan maks dengan elemen ke-N
2.3
kurangi N satu (karena elemen ke-N sudah terurut)
rincian pada setiap pass adalah : pass 1 :
Cari elemen maksimum di L[1..N] pertukarkan elemen maksimum dngan elemen L[N] ukuran larik yang belum terurut = N-1 5
pass 2 :
Cari elemen maksimum di L[1..N-1] pertukarkan elemen maksimum dngan elemen L[N-1] ukuran larik yang belum terurut = N-2
pass N-1 :
Cari elemen maksimum di L[1..2] pertukarkan elemen maksimum dngan elemen L[2] ukuran larik yang belum terurut =1
Elemen yang tersisa adalah L[1], tidak perlu diurut karena hanya satu-satunya.
Contoh: Tinjau larik dengan N=6 buah elemen di bawah ini. Larik ini akan diurut menaik: 29
27
1
10 2
8 3
76 4
5
21 6
pass 1: Cari elemen maksimum di dalam larik L[1..6]
maks = L[5] = 76
Pertukarkan maks dengan L[6], diperoleh : 29
27
1
10 2
8 3
21 4
5
76 6
pass 2: (berdasarkan susunan larik hasil pass 1) Cari elemen maksimum di dalam larik L[1..5]
maks = L[1] = 29
Pertukarkan maks dengan L[5], diperoleh : 21
27
1
10 2
8 3
29 4
5
76 6
pass 3: (berdasarkan susunan larik hasil pass 2) Cari elemen maksimum di dalam larik L[1..4]
maks = L[2] = 27
Pertukarkan maks dengan L[4], diperoleh : 21 1
8
10 2
27 3
29 4
5
76 6
pass 4: (berdasarkan susunan larik hasil pass 3) 6
Cari elemen maksimum di dalam larik L[1..3]
maks = L[1] = 21
Pertukarkan maks dengan L[3], diperoleh : 10
8
1
21 2
27 3
29 4
5
76 6
pass 5: (berdasarkan susunan larik hasil pass 4) Cari elemen maksimum di dalam larik L[1..2]
maks = L[1] = 10
Pertukarkan maks dengan L[3], diperoleh : 8
10 1
21 2
27 3
29 4
5
76 6
tersisa satu elemen (yaitu 8) maka pengurutan selesai. Larik L sudah terurut menaik. Apabila diinginkan larik yang terurut menurun, maka algoritma pengurutan pilih adalah : Untuk setiap pass I = 1, 2, … N-1 1.1 cari elemen terbesar (maks) mulai dari elemen ke-1 sampai elemen ke-N 1.2 pertukarkan maks dengan elemen ke-N rincian pada setiap pass adalah : pass 1 :
Cari elemen maksimum di L[1..N] pertukarkan elemen maksimum dngan elemen L[1]
pass 2 :
Cari elemen maksimum di L[2..N] pertukarkan elemen maksimum dngan elemen L[2]
pass N-1 :
Cari elemen maksimum di L[N-1,N] pertukarkan elemen maksimum dngan elemen L[N-1]
Elemen yang tersisa adalah L[N], tidak perlu diurut karena hanya satu –satunya.
Contoh: Tinjau larik dengan N=6 buah elemen di bawah ini. Larik ini akan diurut menaik: 29 1
27
10 2
8 3
76 4
5
21 6 7
pass 1: Cari elemen maksimum di dalam larik L[1..6]
Imaks = 5, L[Imaks] = 76
Pertukarkan L[Imaks] dengan L[1], diperoleh : 76
27
1
10 2
8 3
29 4
21
5
6
pass 2: (berdasarkan susunan larik hasil pass 1) Cari elemen maksimum di dalam larik L[2..6]
Imaks = 5, L[Imaks] = 29
Pertukarkan L[Imaks] dengan L[2], diperoleh : 76
29
1
10 2
8 3
27 4
21
5
6
pass 3: (berdasarkan susunan larik hasil pass 2) Cari elemen maksimum di dalam larik L[3..6]
Imaks = 5, L[Imaks] = 27
Pertukarkan L[Imaks] dengan L[3], diperoleh : 76
29
1
27 2
8 3
10 4
21
5
6
pass 4: (berdasarkan susunan larik hasil pass 3) Cari elemen maksimum di dalam larik L[4..6]
Imaks = 6, L[1maks] = 21
Pertukarkan L[Imaks] dengan L[4], diperoleh : 76
29
1
27 2
21 3
10 4
8
5
6
pass 5: (berdasarkan susunan larik hasil pass 4) Cari elemen maksimum di dalam larik L[5..6]
Imaks = 5, L[Imaks] = 10
Pertukarkan maks dengan L[2], diperoleh : 76 1
29
27 2
21 3
10 4
5
8 6
tersisa satu elemen (yaitu 8) maka pengurutan selesai. Larik L sudah terurut menurun.
8
Algoritma Pengurutan Pilih Minimum Pada algoritma ini, basis pencarian adalah elemen minimum (terkecil). Elemen minimum ditempatkan di awal larik (agar terurut menaik) atau di akhir larik (agar larik terurut menurun) Algoritma pilih minimum untuk memperoleh larik yang terurut menaik secara garis besarnya adalah sebagai berikut: Untuk setiap pass I = 1, 2, … N-1 1.1 cari elemen terbesar (maks) mulai dari elemen ke-1 sampai elemen ke-N 1.2 pertukarkan maks dengan elemen ke-I rincian pada setiap pass adalah : pass 1 :
Cari elemen minimum di L[1..N] pertukarkan elemen minimum dngan elemen L[1]
pass 2 :
Cari elemen minimum di L[2..N] pertukarkan elemen minimum dngan elemen L[2]
pass N-1 :
Cari elemen minimum di L[N-1,N] pertukarkan elemen minimum dngan elemen L[N-1]
Elemen yang tersisa adalah L[N], tidak perlu diurut karena hanya satu –satunya. Contoh: Tinjau larik dengan N=6 buah elemen di bawah ini. Larik ini akan diurut menaik: 29
27
1
10 2
8 3
76 4
5
21 6
pass 1: Cari elemen minimum di dalam larik L[1..6]
Imin = 4, L[Imin] = 8
Pertukarkan L[Imin] dengan L[1], diperoleh : 8
27 1
10 2
29 3
76 4
5
21 6
pass 2: (berdasarkan susunan larik hasil pass 1) Cari elemen maksimum di dalam larik L[2..6]
Imin = 3, L[Imin] = 10
Pertukarkan L[Imin] dengan L[2], diperoleh : 8
10 1
27 2
29 3
76 4
5
21 6 9
pass 3: (berdasarkan susunan larik hasil pass 2) Cari elemen maksimum di dalam larik L[3..6]
Imin = 6, L[Imin] = 21
Pertukarkan L[Imin] dengan L[3], diperoleh : 8
10 1
21 2
29 3
76 4
27
5
6
pass 4: (berdasarkan susunan larik hasil pass 3) Cari elemen maksimum di dalam larik L[4..6]
Imin = 6, L[Imin] = 27
Pertukarkan L[Imin] dengan L[4], diperoleh : 8
10 1
21 2
27 3
76 4
29
5
6
pass 5: (berdasarkan susunan larik hasil pass 4) Cari elemen maksimum di dalam larik L[5..6]
Imin = 6, L[Imin] = 29
Pertukarkan L[Imin] dengan L[5], diperoleh : 8
10 1
21 2
27 3
29 4
76
5
6
tersisa satu elemen (yaitu 76) maka pengurutan selesai. Larik L sudah terurut menaik. Apabila diinginkan elemen terururt menurun, maka lakukan proses sebaliknya. Contoh: Tinjau larik dengan N=6 buah elemen di bawah ini. Larik ini akan diurut menaik: 29
27
1
10 2
8 3
76 4
21
5
6
pass 1: Cari elemen minimum di dalam larik L[1..6]
Imin = 4, L[Imin] = 8
Pertukarkan L[Imin] dengan L[N], diperoleh : 29 1
27
10 2
21 3
76 4
5
8 6 10
pass 2: (berdasarkan susunan larik hasil pass 1) Cari elemen maksimum di dalam larik L[1..5]
Imin = 3, L[Imin] = 10
Pertukarkan L[Imin] dengan L[5], diperoleh : 29
27
1
76 2
21 3
10 4
8
5
6
pass 3: (berdasarkan susunan larik hasil pass 2) Cari elemen maksimum di dalam larik L[1..4]
Imin = 4, L[Imin] = 21
Pertukarkan L[Imin] dengan L[4], diperoleh : 29
27
1
76 2
21 3
10 4
8
5
6
pass 4: (berdasarkan susunan larik hasil pass 3) Cari elemen maksimum di dalam larik L[1..3]
Imin = 2, L[Imin] = 27
Pertukarkan L[Imin] dengan L[3], diperoleh : 29
76
1
27 2
21 3
10 4
8
5
6
pass 5: (berdasarkan susunan larik hasil pass 4) Cari elemen maksimum di dalam larik L[1..2]
Imin = 1, L[Imin] = 29
Pertukarkan L[Imin] dengan L[2], diperoleh : 76 1
29
27 2
21 3
10 4
5
8 6
tersisa satu elemen (yaitu 76) maka pengurutan selesai. Larik L sudah terurut menurun. Dibandingkan dengan metode pengurutan gelembung, metode ini lebih baik karena operasi pertukaran elemen hanya dilakukan sekali saja pada setiap pass, dengan demikian lama pengurutannya berkurang dibandingkan metode pengurutan gelembung.
11
2.2.3
Metode Pengurutan Sisip Berdasarkan namanya, pengurutan sisip (insertion sort) adalah metode
pengurutan dengan cara menyisipkan elemen larik pada posisi yang tepat. Pencarian posisi yang tepat dilakukan dengan cara menyisir larik. Selama penyisiran dilakukan pergeseran elemen larik. Metode ini cocok untuk persoalan menyisipkan elemen baru ke dalam sekumpulan elemen yang sudah terurut.
Algoritma Pengurutan Sisip { untuk pengurutan menaik} untuk setiap pass I = 2, 3, …. N , lakukan 1. set y = L[I] 2. sisipkan y pada tempat yang tepat antara L[1] …. L[2] rincian setiap pass adalah : Asumsi (dianggap sebagai pass 1) : L[1] dianggap sudah pada tempatnya Pass 2 :
Elemen y =L[2] harus dicari tempatnya yang tepat ke dalam L[1..2] dengan cara menggeser elemen L[1..1] ke kanan (atau ke bawah) jika anda membayangkan larik terentang vertikal), bila L[1..1] lebih besar L[1]. Misalkan posisi yang tepat adalah K. sisipkan L[2] pada L[K]
Pass 2 :
Elemen y =L[3] harus dicari tempatnya yang tepat ke dalam L[1..3] dengan cara menggeser elemen L[1..2] ke kanan (atau ke bawah) jika anda membayangkan larik terentang vertikal), bila L[1..2] lebih besar L[3]. Misalkan posisi yang tepat adalah K. sisipkan L[3] pada L[K]
Pass N :
Elemen y =L[N] harus dicari tempatnya yang tepat ke dalam L[1..N] dengan cara menggeser elemen L[1..N-1] ke kanan (atau ke bawah) jika anda membayangkan larik terentang vertikal), bila L[1..N-1] lebih besar L[N]. Misalkan posisi yang tepat adalah K. sisipkan L[N] pada L[K]
Hasil dari pass N : larik L[1..N] sudah terurut menaik.
12
Contoh: Tinjau larik dengan N=6 buah elemen di bawah ini. Larik ini akan diurut menaik: 29
27
1
10 2
8 3
76 4
21
5
6
Asumsi (pass 1): Elemen y = L[1] = 29 dianggap sudah terurut 29
27
1
10 2
8 3
76 4
21
5
6
pass 2: (berdasarkan susunan larik hasil pass 1) Cari posisi yang tepat untuk y = L[2] = 27 di dalam L[1..2], diperoleh: 27
29
1
10 2
8 3
76 4
21
5
6
pass 3: (berdasarkan susunan larik hasil pass 2) Cari posisi yang tepat untuk y = L[3] = 10 di dalam L[1..3], diperoleh: 10
27
1
29 2
8 3
76 4
21
5
6
pass 4: (berdasarkan susunan larik hasil pass 3) Cari posisi yang tepat untuk y = L[4] = 8 di dalam L[1..4], diperoleh: 8
10 1
27 2
29 3
76 4
5
21 6
pass 5: (berdasarkan susunan larik hasil pass 4) Cari posisi yang tepat untuk y = L[5] = 76 di dalam L[1..5], diperoleh: 8
10 1
27 2
29 3
76 4
5
21 6 13
pass 6: (berdasarkan susunan larik hasil pass 5) Cari posisi yang tepat untuk y = L[6] = 21 di dalam L[1..6], diperoleh: 8
10 1
21 2
27 3
29 4
76
5
6
Berdasarkan contoh di atas, dapat diketahui bahwa kelemahan dari metode ini terletak pada banyaknya operasi pergeseran yang diperlukan dalam mencari posisi yang tepat untuk elemen larik. Pada setiap pass I, operasi pergeseran yang diperlukan maksimum I-1 kali. Untuk larik N yang besar, jumlah operasi pergeseran meningkat secara kuadratik, sehingga pengurutan sisip kurang bagus untuk volume data yang besar.
2.2.4
Metode Pengurutan Shell Metode ini diberi nama sesuai dengan nama penemunya yaitu Donald
Shell tahun 1959. Metode ini merupakan perbaikan terhadap metode pengurutan sisip. Kelemahan metode sisip sudah diterangkan di atas. Jika data pada posisi ke1000 ternyata posisi yang tepat adalah posisi ke-2, maka dibutuhkan kira-kira 998 kali pergeseran elemen. Untuk mengurangi pergeseran terlalu jauh, kita mengurutkan larik setiap k elemen dengan metode pengurutan sisip, misalkan kita urutkan setiap 5 elemen (k kita namakan juga step atau increment ). Selanjutnya kita gunakan nilai step yang lebih kecil, misalnya k = 3 lalu kita urut setiap 3 elemen. Begitu seterusnya sampai nilai k = 1. karena setiap step selalu berkurang maka metode ini kadangkadang dinamakan juga dengan metode pengurutan kenaikan berkurang (diminishing increment sort).
Contoh: Untuk memperjelas metode pengurutan shell, tinjau pengurutan data integer berikut: 81 94 11 96 1
2
3
4
12 5
35 6
17 7
95 8
28 9
58 10
41 11
75 12
15 13 14
pass 1 (step =5): urutkan setiap 5 elemen 81 94 11 96 1
2
3
4
12 5
35 6
17 7
95 8
28 9
58
41
10
11
75 12
15 13
35………………………..41………………………….81 17……………………….75………………………….94 11…………………………15…………………………95 28…………………………96 12…………………………58 baris pertama menyatakan elemen yang sudah terurut pada posisi 1, 6 dan 11 baris kedua menyatakan elemen yang sudah terurut pada posisi 2, 7 dan 12 baris ketiga menyatakan elemen yang sudah terurut pada posisi 3, 9 dan 13 baris keempat menyatakan elemen yang sudah terurut pada posisi 4 dan 9 baris kelima menyatakan elemen yang sudah terurut pada posisi 5 dan 10 hasil pass 1 : 35, 17, 11, 28, 12, 41, 75, 15, 96, 58, 81, 94, 95 pass 2 (step = 3) : urutkan setiap 3 elemen 35 17 11 28 1
2
3
4
12 5
41 6
75 7
15 8
96 9
58
81
10
11
94 12
95 13
28……………35……………..58………………75………….….95 12……………15……………..17……………….81 11……………..41………………94…………….96 hasil pass 2 : 28, 12, 11, 35, 15, 41, 58, 17, 94, 75, 81, 96, 95 28 12 11 35 1
2
3
4
15 5
41 6
58 7
17 8
94 9
75
81
10
11
96 12
95 13
11…12…15…17…28….35….41….58….75….81….94…95….96 hasil pass 3 : 11, 12, 15, 17, 28, 35, 41, 58, 75, 81, 94, 95, 96 Perhatikanlah pada pass yang terakhir (step =1) pengurutan shell menjadi sama dengan pengurutan sisip biasa. Nilai-nilai step seperti 5, 3 dan 1 bukanlah angka “sihir”. Kita dapat memilih nilai-nilai step yang lain yang bukan kelipatan step yang lain. Pemilihan step yang merupakan perpangkatan dari dua (seperti 8, 4, 2, 1) dapat mengakibatkan perbandingan elemen yang sama pada suatu pass terulang kembali pada pass berikutnya. 15
1. step := N {N ukuran larik} 2. while step>1 do a. step := step div 3 +1 b. for I =1,2 …step do insertion sort setiap elemen step mulai dari elemen ke-I Algoritma pengurutan shell dibuat dengan pertama-tama memodifikasi algoritma pengurutan sisip sedemikian sehinggakita dapat menspesifikasi titik awal pengurutan sisip sedemikian sehingga kita dapat menspesifikasi titik awal pengurutan da ukuran step (pada algoritma pengurutan sisip yang asli, titik awal pengurutan adalah elemen pertama dan ukuran step = 1). Algoritma pengurutan sisip ini kita beri nama InsSort.
2.2.5
Metoda QuickSort Metoda QuickSort juga sering disebut dengan metoda partition exchange
sort.
Metoda
ini
ditemukan
oleh
C.A.R.Hoare
.Untuk
mempertinggi
efektifitasnya, dalam metoda ini jarak kedua elemen yang akan ditukarkan nilainya ditentukan cukup besar. Secara garis besar metoda ini dijelaskan sebagai berikut. Misalkan kita akan mengurutkan vector A yang mempunyai N elemen.Kita pilih sembarang elemen dari vector tersebut,biasanya elemen pertama , misalnya X.Lalu semua elemen tersebut disusun dengan menempatkan X pada posisi J,sedemikian rupa sehingga elemen ke–1 sampai elemen ke J-1 mempunyai nilai lebih kecil dari X dan elemen keJ+1 sampai ke N mempunyai nilai lebih besar dari X. Dengan demikian kita mempunyai 2 buah subvector, subvektor pertama nilai elemennya lebih kecil dari X, subvektor ke-2 nilai elemennya lebih besar dari X. Pada langkah berikutnya, proses di atas diulang pada kedua subvektor, sehingga kita akan mempunyai empat buah subvektor. Proses di atas diulang pada setiap subvektor sehingga seluruh vector semua elemennya terurutkan.
Contoh : Misalkan kita punya vector yang elemennya : 16
23
45
12
24
56
34
27
23
16
Gambar 1 Diambil elemen pertama,yaitu 23. Elemen ini akan diletakkan di suatu posisi sehingga akan membagi vector atas 2 subvektor. Dengan subvektor pertama (subvektor kiri) nilai elemennya selalu lebih kecil atau sama dengan 23, dan subvektor kedua(subvektor kanan)nilainya selalu lebih besar dari 23.Masingmasing subvektor tersaji pada gambar 2. 12
23
16
23
45
24
56
34
27
Gambar 2 Kemudian pada kedua subvektor tersebut kita proses seperti di atas sampai seluruh vector dalam keadaan terurutkan. Gambar 3 menyajikan proses selengkapnya dari metode QuickSort untuk mengurutkan vector dari gambar 1.
23
12
45
23
12
16
24
56
34
23
12
27
45
12
23
23
24
12
16
23
23
24
12
16
23
23
24
23
24
34
16
56
34
27
27
27
27
45
56
34
45
56
34
45
56
Gambar 3. Ilustrasi Quicksort Gambar 3. di atas menunjukkan proses pembagian dari vector menjadi subvektor-subvektor,subvektor menjadi subvektor dan seterusnya. Gambar 4 memperlihatkan isi vector setelah proses pengurutan selesai dilaksanakan. 12
16
23
23
24
27
34
45
56
Gambar 4.Hasil akhir dari metoda QuickSort 17
Dari ilustrasi di atas dapat dilihat bahwa metoda QuickSort bisa diimplementasikan menggunakan dua cara,yaitu : 1. Cara non Rekursif 2. Cara Rekursif Pada kedua cara implementasi di atas, persoalan utama yang perlu diperhatikan adalah bagaimana kita meletakkan suatu elemen pada posisi yang tepat sehingga memenuhi ketentuan di atas dan bagaimana menyimpan batasbatas subvektor pada saat vector dibagi menjadi dua subvektor, kemudian menjadi 4 subvektor,8 subvektor dan seterusnya. Gambar 3 memperlihatkan bahwa elemen pertama sampai di suatu tempat yang sesuai hanya dengan bergerak satu arah saja. Sedangkan untuk mempercepat penempatan suatu elemen , kita bisa bergerak dari dua arah, kiri dan kanan. Caranya adalah sebagai berikut : Misalkan kita mempunyai vector dengan 9 elemen (N=9) 45 64 12 24 56 34 127 23 126 I=1
J=9
1. Tentukan I=1(untuk bergerak dari kiri ke kanan) dan J=N(untuk bergerak dari
kanan ke kiri)
Proses akan dihentikan bila nilai I lebih besar atau sama dengan J 2. ambil 45(elemen pertama) pada posisi yang tepat bergerak dua arah.Dimulai dari elemen terakhir bergerak dari kanan ke kiri (J-1) lakukan pembandingan elemen yang dilalui dengan 45 sampai ditemukan elemen yang nilainy lebih kecil dari 45, yaitu 23,tukarkan kedua vector. 23 64 12 24 56 34 127 45 126 I=1
J=8
3. Bergerak dari kiri ke kanan (I+1),dimulai dari 23. Lakukan pembandingan pada setiap elemen yang dilalui dengan 45, sampai ditemukan elemen yang nilainya lebih besar dari 45, yaitu 64.Tukarkan kedua elemen. 23 45 12 24 56 34 127 64 126 I=2
J=8
4. Bergerak dari kanan ke kiri dimulai dari 127. Ditemukan bahwa 34 lebih kecil dari 45, sehingga kedua elemen ini saling ditukarkan. 18
23 34 12 24 56 45 127 64 126 I=2
J=6
5. Mulai dari 12(bergerak dari kiri ke kanan) sampai ditemukan elemen yang nilainya lebih besar dari 45,yaitu 56.Tukarkan kedua elemen. 23 34 12 24 45 56 127 64 126 I=5 J=6 5. Mulai dari 45(J=5) bergerak ke kiri sampai ditemukan elemen yang nilainya lebih kecil dari 45. Pada langkah ini ternyata nilai I dan J adalah sama. Hal ini berarti proses penempatan elemen yang bernilai 45 telah selesai . Di sini kita dapatkan bahwa semua elemen yang terletak di sebelah kiri nilainya selalu lebih kecil dari 45, semua elemen yang terletak di sebelah kanan nilainya selalu lebih besar dari 45 ,seperti yang terlihat di bawah ini : 23
34
12
24
Subvektor kiri
45
56
127 64
126
subvektor kanan
a. Metoda QuickSort Non Rekursif Implementasi secara non rekursif memerlukan dua buah tumpukan yang digunakan untuk menyimpan batas-batas subvektor. Tumpukan pertama mencatat batas kiri subvektor dan tumpukan kedua mencatat bata kanan. Masing-masing elemen pada dua tumpukan ini harus bertipe integer karena mencatat subskrip suatu elemen . dalam prosedur yang disajikan hanya digunakan sebuah tumpukan ,tapi elemennya bertipe record yang terdiri dari dua medan, yaitu Kiri (untuk mencatat batas kiri) dan Kanan (untuk mencatat batas kanan). Dalam hal ini tumpukan dideklaraikan sebagai array. Dengan mengacu pada contoh di atas, sebelum metoda ini dijalankan elemen pertama tumpukan (elemen paling atas),medan kiri diatur sama dengan 1,dan medan kanan sama dengan N, lihat gambar 5.a. Setelah elemen yang bernilai 45 dibawa pada posisi yang tepat maka isi tumpukan akan berubah seperti gambar 5.b. 19
Sesuai dengan sifat tumpukan, maka elemen paling atas akan dikerjakan lebih dulu. Sehingga denga melihat gambar 5.b, maka subvektor kanan (dengan batas Kiri = 6 dan batas kanan = 9) akan dikerjakan lebih dulu. Pada saat subvektor ini dikerjakan maka isi tumpukan ini akan dipop. Dengan kata lain pada saat program mengerjakan subvektor sebelah kanan, maka isi tumpukan hanya tinggal sebuah elemen.
1
9
kiri
kanan
6
9
1
4
kiri
a
kanan b
Gambar 5. Perubahan isi tumpukan a. Pada saat mulai iterasi b. Setelah satu elemen ditempatkan
Algoritma QUICKSORT_NON_REKURSIF [Pengurutan elemen menggunakan metoda non rekursifQuickSort. Masukan dinyatakan sebagai vector A(belum terurutkan),dan N(banyak elemen).Keluaran adalah vector A yang sudah terurut.] Langkah 0
Baca vector yang akan diurutkan(dalam program utama) dan deklarasikan sebuah tumpukan.
Langkah 1
(Inisialisasikan tumpukan) Tentukan Ujung = 1, Tumpukan[1].Kiri = 1, dan Tumpuka[1].Kanan = N.
Langkah 2
Kerjakan langkah 3 dan 4 sampai Ujung = 0.
Langkah 3
(Menentukan subvektor yang akan dikerjakan,sekaligus mempop elemen teratas tumpukan) Tentukan : Kr = Tumpukan [Ujung].Kiri, Knn = Tumpuka[Ujung].Kanan,dan Ujung = Ujung – 1.
Langkah 4
Kerjakan langkah 5 sampai 10 sampai Knn<=Kr. 20
Langkah 5
(Mengatur I dan J untuk mulai proses) Tentukan : I = Kr, J = Knn, dan Tengah = A[(Kr+Knn) div 2]
Langkah 6
Kerjakan langkah 7 sampai 9 sampai I > J.
Langkah 7
(Bergerak dari Kiri ke Kanan) Tambah nilai I dengan 1 selama A[I] < Tengah.
Langkah 8
(Bergerak dari kanan ke kiri) Kurangi nilai J dengan 1 selama Tengah < A[J].
Langkah 9
Test : apakah I <= J ? Jika ya,kerjakan langkah-langkah berikut : -
Tukarkan A[I] dengan A[J],
-
Tambah nilai I dengan 1,
-
Kurangi nilai J dengan 1.
Langkah 10
Tentukan : Knn = J
Langkah 11
Selesai
b. Metoda QuickSort Rekursif Cara ini bisa dilaksanakan karena sesungguhnya Quick Sort ini terdiri dari 3 langkah, yaitu: penenpatan suatuelemen pada posisinya yang tepat, kemudian mengurutkan subvektor kiri dan subvektor kanan. Dalam mengurutkan subvektor kiri atau kanan ketiga langkah ini diulang kembali dengan menentukan batas-batas subvektor yang akan diproses. Batas akhir proses rekursif ditentukan apabila batas kiri subvektor sudah sama dengan atau lebih besar dari batas kanan. Secara sederhana,metoda ini bisa dituliskan sebagai : Procedure QUICKSORT ( var A : larik,awal,akhir : integer); Var I,J : integer ; Begin If awal < akhir then Begin ATUR;
{*menempatkan suatu elemen pada posisi J *}
QUICKSORT(A,awal,J-1); {*memproses subvektor kiri *}
21
QUICKSORT(A,J+1,akhir); {*memproses subvektor kanan*} End End.
Prosedur di atas dalam program utama dipanggil dengan cara : QUICKSORT(A, 1, N );
Dengan A adalah vector yang akan diurutkan, dan N cacah elemen vector. Dari struktur di atas yang perlu dijelaskan adalah prosedur ATUR yang digunakan untuk menempatkan elemen pertama pada posisinya yang tepat sesuai dengan contoh sebelumnya.
Algoritma ATUR [Digunakan untuk menempatkan elemen pertama pada posisi J sedemikian rupa sehingga elemen ke 1 sampai
elemen ke J-1 selalu lebih kecil dari elemen
tersebut, dan elemen ke J+1 sampai ke elemen ke N selalu lebih besar dari elemen tersebut] Langkah 1 Tentukan : I = Awal + 1. Langkah 2 (Bergerak dari kiri ke kanan ) Tambah nilai I dengan 1 selama A[I] < A[Awal] Langkah 3 (Bergerak dari kanan ke kiri ) Kurangi nilai I dengan 1 selama A[J] > A[Awal]. Langkah 4 Kerjakan langkah 5 sampai 7 selama I < J Langkah 5 tukarkan nilai A[1] dengan A[J]. Langkah 6 (Bergerak dari kiri ke kanan) Tambah nilai I dengan 1 selama A[I] < A[awal]. Langkah 7 (Bergerak dari kanan ke kiri ) Kurangi nilai I dengan 1 selama A[J] > A[awal] Langkah 8 Tukarkan nilai A[I] dengan A[J] Langkah 9 Selesai.
22
2.2.6
Metode RadixSort Metode ini didasarkan pada nilai sesungguhnya dari suatu digit pada
bilangan yang akan diurutkan. Seperti kita ketahui dalam sistem bilangan desimal, nilai sesungguhnya dari setiap digit akan ditentukan oleh posisi dimana digit itu berada. Sebagai contoh, dalam bilangan 2762 kita katakan bahwa nilai digit dua yang pertama berbeda dengan nilai digit dua yang kedua. Pada bilangan diatas bisa dikatakan bahwa digit 2 (yang pertama) diletakkan pada posisi “ribuan”, digit 7 pada posisi “ratusan”, digit 6 pada posisi “puluhan” dan digit 2 (yang kedua) diletakkan pada posisi “satuan”. Maka pada subbab ini digit yang ditulis paling kiri kita namakan dengan digit signifikan terbesar (most significant digit) disingkat DSB dan yang paling kanan dinamakan digit significant terkecil (least significant digit) disingkat DSK.
Contoh : Data : 342, 547,321, 213, 458, 621, 120, 958, 124, 844 Iterasi pertama Data
Kelompok 0 1
342 547 321 213 458 621 120 120 958 124 844 Hasil 120
2 342
3
4
5
6
7
8
9
547 321 213 458 621 958 321
621
342
124 844 213
2 120 321 621
3
4
124
844
547
458
958
5
6
7
8
9
Iterasi kedua Data 120 321 621 342 213
Kelompok 0 1
342 213 23
124 844 547 458 958 Hasil 213
124 844 547 120
321
621
124
458 958 342
2 213
3
4
5
844
547
458
958
6
7
8
9
Iterasi ketiga Data
Kelompok 0 1
213 120 321 621 124 342 844 547 458 958 Hasil 120
120 321 621 124 342 844 547 458 124
213
321
342
458
547
621
844
958 958
Iterasi selesai ……………. Maka data terurut adalah 120, 124, 213, 321, 342, 458, 547, 621, 844, 958
2.2.7
Metode MergeSort Metode yang akan dijelaskan biasanya disebut dengan metode MergeSort
Dua Arah (Two-way MergeSort). Metode ini memanfaatkan keteraturan yang diperoleh dari hasil merging dua buah vektor Secara singkat dapat dijelaskan sebagai berikut. Vektor masukan dianggap yang mempunyai N eleman dianggap sebagai N buah vektor yang masing-masing terdiri dari sebuah vektor. Untuk setiap pasang vektor kita lakukan proses merging sehingga akan kita peroleh N/2 vektor yang masing-masing terdiri dari 2 elemen (jika N ganjil, akan terdapat sebuah vektor dengan 1 elemen). Kemudian dilakukan merging kembali untuk setiap pasang vektor, sehingga kita peroleh N/4 vektor. Langkah ini kita teruskan sampai kita memperoleh sebuah vektor yang sudah dalam keadaan urut.
24
Contoh : Data yang akan diurutkan adalah: 15
15
12
45
12
12
45
15
12
56
56
45
15
10
10
12
13
34
15
34
34
43
56
43
34
45
65
34
34
13
43
56
43
13
10
15
43
10
10
56
13
10
13
56
45
12
13
43
56
45
56
56
65
56
65
56
65
56
65
65
gambar 1. ilustrasi metode mergesort algoritma yang kita gunakan adalah algoritma merging : 1. input Ca, Cb (banyak elemen pada vektor) 2. inisialisasi i =1, j =1 dan Cc =0 3. repeat apakah Ai < Bj ya, CCc = Ai, dan i = i+1 tdk, CCc = Bj, dan j = j+1 until i > Ca atau j > Cb 4. apakah i > Ca ya,
untuk k = j ….. Cb Cc = Cc +1 dan CCc = Bk
tdk, untuk k = i ….. Ca Cc = Cc + 1 dan CCc = Ak 5. selesai
25
2.2.8
Metode Treesort Metoda treesort adalah suatu metoda yang juga bisa digunakan untuk
mengurutkan data. Pada Bab VII Struktur pohon telah dibahas bagaimana menyusun sebuah pohon dan melakukan kunjungan untuk memperoleh informasi yang tersimpan dalam pohon dan sesuai dengan macam kunjungan yang dilakukan. Pada dasarnya dalam pembentukan sebuah pohon perlu diperhatikan kapan suatu simpul akan dipakai sebagai cabang kiri dan kapan sebagai cabang kanan. Pada makalah ini kami menggunakan salah satu aturan yaitu informasi yang tersimpan pada cabang kiri nilainya selalu lebih kecil dari simpul akar dan informasi yang tersimpan dalam simpul akar nilainya selalu lebih besar dari yang tersimpan pada cabang kanan. Dalam penyusunan pohon ini kita dapat melakukannya dengan kunjungan inorder. Kunjungan inorder ini juga telah dibahas pada struktur pohon yaitu dengan cara : -
kunjungi cabang kiri
-
kunjungi cabang kanan
-
cetak isi simpul yang dikunjungi
Penyusunan (pengurutan) dalam keadaan menaik dapat kita lakukan dengan LRO, dan sebaliknya dalam keadaan menurun dapat dilakukan dengan RLO. Pada contoh pohon dibawah kami menggunakan kunjungan inorder yang dapat menghasilkan informasi dalam keadaan terurut. Dari pohon tersebut,didapat urutan yang berisi “ABCDEFGHIJKLMNOPQ” dengan LRO dan akan diperoleh urutan “QPONMLKJIHGFEDCBA”. I
G
M
C
B
A
H
E
D
K
J
N
L
F
P
O
Q
gambar 9.12. Contoh pohon untuk TreeSort 26
27