1

BAB IV STACK (TUMPUKAN)
Stack merupakan metode dalam menyimpan atau mengambil data ke dan dari memori. Stack dapat dibratkan sebuah tumpukan barang dalam sebuah tempat yang hanya memiliki satu pintu diatsnya (memasukan dan mengambil barang hanya dapat dilakukan melalui pintu itu). Ukuran barang tersebut pas dengan pintunya, sehingga barang yang akan dikeluarkan pertama kali adalah barang yang terkhir kali dumasukan. Contoh dalam kehidupan sehari-hari adalah tumpukan piring di sebuah restoran yang tumpukannya dapat ditambah pada bagian paling atas dan jika mengambilnya pun dari bagian paling atas pula. Lihat gambar 1. Dengan demikian, kaidah stack adalah First In Last Out (FILO) atau Last In First Out (LIFO).

Tumpukan uang koin

Tumpukan kotak Gambar 1. Macam-macam tumpukan

Tumpukan Buku

Ada 2 operasi paling dasar dari stack yang dapat dilakukan, yaitu : 1. 2. Operasi push yaitu operasi menambahkan elemen pada urutan terakhir (paling atas). Operasi pop yaitu operasi mengambil sebuah elemen data pada urutan terakhir dan menghapus elemen tersebut dari stack. Sebagai contoh, misalkah ada data sebagai berikut : 1 3 5 6, maka data tersebut dapat tersimpan dalam bentuk sebagai berikut : N N-1 6 5 3 1 1 3 5 6 1 2

Top

Top

2 1 Top

N-1 N

1 1

3 2

5

6 N

N-1 Gambar 2. Asumsi-asumsi penyimpanan stack

Contoh lain adalah ada sekumpulan perintah stack yaitu push(5), push(7), pop, push(3), pop. Jika dijalankan, maka yang akan terjadi adalah :

Top Top Top=0 Kosong Push(5) 5

7 5

Top Top 5

3 5

Top

5 Top=0 Kosong Pop

Push(7)

Pop Push(3) Pop Gambar 3. Proses operasi stack

2 Selain operasi dasar stack (push dan stack), ada lagi operasi lain yang dapat terjadi dalam stack yaitu : 1. Proses deklarasi yaitu proses pendeklarasian stack. 2. Proses inisialisasi yaitu proses pembuatan stack kosong, biasanya dengan pemberian nilai untuk top. Representasi stack dalam pemrograman, dapat dilakukan dengan 2 cara yaitu : 1. Representasi stack dengan array 2. Representasi stack dengan single linked list Sebagai contoh representasi kedua cara tersebut dengan operasi yang dilakukan adalah push(1), push(2), pop, push(5), push(8), pos. Untuk lebih detail, perhatikan gambar di bawah ini : Representasi stack dengan menggunakan array dengan maksimal data 5 adalah

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Top 8 ? ? Top 2 2 Top 5 5 ? Top 1 1 Top 1 1 1 Top=0 Top=1 Top=2 Top=3 Top=2 Top=3 Maks=5 Maks=5 Maks=5 Maks=5 Maks=5 Maks=5 Kondisi Push(1) Push(2) Pop Push(5) Push(8) awal Elemen berisi ? berarti nilai elemen tidak diketahui. Gambar 4. Representasi stack dengan menggunakan array Operasi-operasi stack secara lengkap adalah sebagai berikut : 1. Pendeklarasian stack

? ? 8 Top 5 1 Top=2 Maks=5 Pop

Proses pendeklarasian stack adalah proses pembuatan struktur stack dalam memori. Karena stack dapat direpresentasikan dalam 2 cara, maka pendeklarasian stack pun ada 2 yaitu : Pendeklarasian stack yang menggunakan array. Suatu stack memiliki beberapa bagian yaitu  top yang menunjuk posisi data terakhir (top)  elemen yang berisi data yang ada dalam stack. Bagian ini lah yang berbentuk array. Dalam bahasa Pascal, pendeklarasiannya adalah : Const max = 100; Type tstack = record Top:0..max; elemen:array[1..max]of elemen; var stack: tstack; 2. Inisialisasi Inisialisasi stack adalah proses pembuatan suatu stack kosong. Adapun langkah-langkah proses tersebut berdasarkan jenis penyimpanannya adalah : Inisialisasi stack yang menggunakan array. Proses inisialisasi untuk stack yang menggunakan array adalah dengan mengisi nilai field top dengan 0 (nol) jika elemen pertama diawali dengan nomor 1. Implementasinya dalam bahasa Pascal adalah : procedure inisialisasi(var stack :tstack); begin stack.top:=0; end; 3. Operasi Push Operasi push adalah operasi dasar dari stack. Operasi ini berguna untuk menambah suatu elemen data baru pada stack dan disimpan pada posisi top yang akan mengakibatkan posisi top akan berubah. Langkah operasi ini adalah : a. Operasi push pada stack yang menggunakan array.

1 Aplikasi Stack Notasi Polish (Polish Notation) Dalam operasi aritmatika. yaitu : 1. perhatikan lagi gambar 4 mengenai representasi stack dengan array. Pop Gagal. 4. Push Gagal. Langkah operasi pop pada stack yang menggunakan array adalah terlebih dahulu memeriksa apakah stack sedang keadaan kosong. Operasi ini berguna untuk mengambil elemen terakhir (top) dan kemudian menghapus elemen tersebut sehingga posisi top akan berpindah. begin if stack. Operasi ini biasanya dibuat dalam bentuk function yang me-return-kan nilai sesuai data yang ada di top. {push 5 ke dalam stack} Operasi Pop Operasi pop adalah salah satu operasi paling dasar dari stack.atau EF* atau GH/ Komputer umumnya hanya mengenal ekspresi matematika yang ditulis dalam notasi postfix. Ekspresi matematika yang ditulis dalam notasi infix agar dikenal oleh computer harus diubah dengan memperhatikan : . kemudian elemen pada posisi top diisi dengan elemen data baru. Notasi Infix (menempatkan operator di antara 2 operand) Contoh : A+B atau C-D atau E * F atau G / H 2.top +1.top]. end else writeln(‘Stack Full. end else writeln(‘Stack Empty.top:= stack. Jika topbernilai 0 (tidak penuh) maka proses push dilaksanakan dan jika top bernilai sama dengan max (stack penuh).’).elemen[stack. end.top > 0 then begin baru:=stack.. Operasi pop pada stack yang menggunakan array. maka proses push digagalkan.. baru:integer). Notasi Postfix (menempatkan operator di belakang/setelah operandnya) Contoh : AB+ atau CD. begin if stack. stack. Implementasi operasi ini dalam bahasa Pascal adalah : Procedure push(var stack: tstack.elemen[stack. stack. push(stack.  Proses push-nya sendiri adalah dengan menambah field top dengan 1. Untuk lebih jelas.top:= stack.5).top]:=baru. Implementasinya dalam bahasa Pascal adalah : Procedure push(var stack: tstack.’).3 Langkah operasi push dalam array adalah dengan :  Periksa apakah stack penuh. a. jika tidak kosong maka data diambil pada posisi yang ditunjuk oleh posisi top. baru:integer). end. Cara penggunaannya adalah : 6. Notasi Prefix (menempatkan operator di depan / sebelum ke-2 operandnya) Contoh : +AB atau –CD atau *EF atau /GH 3. dikenal 3 jenis notasi.top -1.top < max then begin stack. Untuk lebih jelas perhatikan kembali gambar 4 .

f. Keluar Contoh kasus : Q:A+(B*C -(D/E^F)*G)*H Tambahkan “(” ke stack dan tambahkan tanda “)” ke sentinel Q sehingga Q menjadi Q:A+(B*C -(D/E^F)*G)*H) Dari Q. d. maka pop operator tersebut dan tambahkan ke P. Jika yang discan adalah operand.4 1. 1. Mengubah notasi infix menjadi postfix. kemudian menghitungnya 2. kemudian tambahkan ke P sedangkan tanda “(“ tidak disertakanke P. terdapat 20 simbol yaitu : Q No : A 1 + 2 ( 3 B 4 * 5 C 6 7 ( 8 D 9 / 10 E 11 ^ 12 F 13 ) 14 * 15 G 16 ) 17 * 18 H 19 ) 20 Urutan operasinya adalah : No Simbol ( ( (+ (+( (+( (+(* (+(* (+((+(-( (+(-( (+(-(/ (+(-(/ (+(-(/^ (+(-(/^ (+((+(-* (+(-* (+ (+* (+* Stack Ekspresi P A A 1 + A 2 ( A 3 B AB 4 * AB 5 C ABC 6 ABC* 7 ( ABC* 8 D ABC*D 9 / ABC*D 10 E ABC*DE 11 ^ ABC*DE 12 F ABC*DEF 13 ) ABC*DEF^/ 14 * ABC*DEF^/ 15 G ABC*DEF^/G 16 ) ABC*DEF^/G*17 * ABC*DEF^/G*18 H ABC*DEF^/G*-H 19 ) ABC*DEF^/G*-H*+ 20 Dari proses di atas didapatkan bahwa postfixnya adalah ABC*DEF^/G*-H*+ . maka tambahkan ke P Jika yang discan adalah “(“ maka push ke stack Jika yang discan adalah “)” maka pop isi stack sampai ditemukan tanda “(“. e. Jika yang discan adalah operator. maka :   g. Jika elemen paling atas dari stack adalah operator yang mempunyai tingatan sama atau lebih tinggi dari operator yang discan. Push tanda “(“ ke stack dan tambahkan tanda “)” di sentinel di Q.d f untuk setiap elemen Q sampai stack Q kosong. kemudian ulangi langkah c s. Mengubah Notasi Infix menjadi Notasi Postfix Dimisalkan Q adalah ekspresi matematika yang ditulis dalam notasi infix dan P adalah penampung ekspresi matematika dalam notasi postfix. Push operator tersebut ke stack. c. Menggunakan stack sebagai penampung sementara operator dan operandnya. b. maka algoritmanya adalah : a. Scan Q dari kiri ke kanan.

Jika yang discan adalah operand. *. simpan dalam variable var2. 2 5. Push variable hitung ke stack. Tambahkan tanda “)”pada sentinel P sehingga P : 5. 4 40. maka push ke stack. maka     e. c. 2. Tambahkan tanda “)” pada sentinel di P Scan P dari kiri ke kanan. Pop 1 buah elemen teratas dari stack. -.hitung=40 – 3 = 37 Perulangan selesai karena telah mencapai sentinel dan data dalam stack adalah 37 (hasil akhir). Hitung variable (var2 opr1 var1). /. 12 40. 6 5. b. 12. 12. Pop isi stack dan simpan di variable value. Jadi hasil operasi tersebut adalah : 37 . Contoh : P : 5.var2=40. 4. /. d.hitung=12 / 4 = 3 Var1=3.5 2. +. 6.var2=12. 4.var2=2. Jika yang discan adalah operator (sebut opr1). f. ulangi langkah c dan d untuk setiap elemen P sampai ditemukan sentinel. didapatkan 10 simbol yaitu : P No : 5 1 2 2 6 3 + 4 * 5 12 6 4 7 / 8 9 ) 10 Urutan operasinya adalah : No 1 2 3 4 5 6 7 8 9 10 Simbol 5 2 6 + * 12 4 / ) Stack 5 5. simpan dalam variable var1. 6. +. *. 12. 2. 2. ) Dari P. Menghitung Ekspresi Matematika yang disusun dalam Notasi Postfix Diasumsikan P adalah ekspresi matematika yang ditulis dalam notasi postfix dan variable value sebagai penampung hasil akhir. 3 37 Operasi Perhitungan var1=6. 8 40 40.hitung=2 + 6 =8 var1=8. Pop 1 buah elemen teratas dari stack. Algoritmanya adalah : a. Keluar.var2=5.hitung=5 * 8 =40 var1=4. simpan hasil di variable hitung.

... sedangkan L[3..1 Bubble Sort ( Pengurutan Gelembung) Pada bubble sort setiap iterasi diperiksa dua data yang bersebelahan. elemen L[1] berisi harga minimum pertama. Pada akhir tiap iterasi maka data terkecil yang ada pada sisa tabel telah bergeser ke bagian sebelah kiri /bagian atas dari tabel. Pass 2 : Mulai dari elemen J=N. tukarkan L[J] dengan L[J-1].. seringkali data kunci diletakkan juga pada tabel alamat..N-1. elemen L[3] berisi harga minimum ketiga dan larik L[1. algoritma pengurutan gelembung dapat ditulis sacara global sbb: Untuk setiap langkah (pass) ke-I=1. .…. Pada akhir langkah 3.. .….2. . tukarkan L[J] dengan L[J-1]. . Tukarkan L[J] dengan L[J-1] jika L[J] < L[J-1] Rincian setip pass adalah sbb: Pass 1 : Mulai dari elemen J=N. bandingkan L[J] dengan L[J-1]. Jika L[J] < L[J-1].. sedangkan informasi satelit tetap terpisah. Pada akhir langkah N-1. Pass N-1 : Mulai dari elemen K=N.. tukarkan L[J] dengan L[J-1].. prose..N] belum terurut. .3] terurut. bandingkan L[J] dengan L[J-1]. Jika L[J] < L[J-1]. Bila urutan tidak dipenuhi ke dua data tersebut saling bertukar tempat. Sorting List (List Sorting) : Pengurutan tidak dilakuakn secra fisik.I+1.N] belum terurut....2] terurut.lakukan : 1.N-1.….…. Jika L[J] < L[J-1].4. elemen L[2] berisi harga minimum kedua dan larik L[1.N-1. Sorting Tabel Alamat (Address Table Sorting) : Pengurutan tidak dilakukan secara fisik akan tetapi dengan cara membuat tabel alamat.N-1. Pada akhir langkah 2. ].. bandingkan L[J] dengan L[J-1]. lakukan : Metode 1 (untuk pengurutan ascending) : Mulai dari elemen J=N.. Pada akhir langkah 1. 2.2. Proses pengurutannya disebut Sorting Kunci (Key Sorting). elemen L[N-1] berisi nilai minimum ke (N-1) danlarik L[1. Sebagai conoth hasil proses : 1 2 3 4 Kunci 71 23 5 47 Informasi satelit . Bandingkan L[J] dengan L[J-1].. Jika L[J] < L[J-1]...N-1. Untuk mendapatkan larik yang terurut menaik. bandingkan L[J] dengan L[J-1]. Sorting External : Proses pengurutan sekelompok data yang sebagian saja berada didalam memori yang ada (atau yang dialokasikan untuk proses) tidak dapat menampung semua data sekligus. tukarkan L[J] dengan L[J-1]. Pointer Head 6. akan tetapi dengan mengubah isi pointer.. Pass 3 : Mulai dari elemen J=N.. Contoh : 44 55 12 42 94 18 06 67 .6 BAB VI SORTING (PENGURUTAN) INTERNAL Sorting Internal : Proses pengurutan sekelompok data yang berada didalam memori utama komputer.…. Sebagai conoth hasil proses : Kunci 1 71 2 23 3 5 4 47 Untuk mempercepat Informasi satelit Tabel alamat .3.. sedangkan L[4.N-1] terurut menaik(elemen yang tersisa adalah L[N] tidak perlu diurut karena hanya satu-satunya).

lakukan : 1. {peubah bantu pertukaran} Begin For I := 1 to n-1 do For J := n downto I+1 do If L[J] < L[J-1] then {pertukaran L[J] dengan L[J-1]. L[J-1] := Temp. Var I : integer.…. {pencacah untuk jumlah langkah} J : integer. L[J-1] := Temp. {peubah bantu pertukaran} Begin For I := 1 to n-1 do For J := n downto I+1 do If L[J] > L[J-1] then {pertukaran L[J] dengan L[J-1]. End.N:integer). Tukarkan L[J] dengan L[J+1] jika L[J] > L[J+1] Contoh : 44 Pass 1 44 1 12 1 55 12 2 42 2 12 42 3 44 3 42 55 4 18 4 94 18 5 06 5 18 06 6 55 6 06 67 7 67 7 67 94 8 94 8 Pass 2 . {pencacah untuk pengapungan pada setiap langkah} Temp : integer. Procedure urutgelembung1_descending(var L:larik. Var I : integer. Temp := L[J]. L[J] := L[J-1]. End. Bandingkan L[J] dengan L[J+1]. Temp := L[J]. Metode 2 (untuk pengurutan ascending) : Mulai dari elemen J=1.1. {pencacah untuk jumlah langkah} J : integer. 2.N:integer).N-1. L[J] := L[J-1].7 Pass 1 06 1 06 1 06 1 06 1 06 1 06 1 06 1 44 2 12 2 12 2 12 2 12 2 12 2 12 2 55 3 44 3 18 3 18 3 18 3 18 3 18 3 12 4 55 4 44 4 42 4 42 4 42 4 42 4 42 5 18 5 55 5 44 5 44 5 44 5 44 5 94 6 42 6 42 6 55 6 55 6 55 6 55 6 18 7 94 7 67 7 67 7 67 7 67 7 67 7 67 8 67 8 94 8 94 8 94 8 94 8 94 8 Pass 2 Pass 3 Pass 4 Pass 5 Pass 6 Pass 7 Procedure urutgelembung1_ascending(var L:larik. {pencacah untuk pengapungan pada setiap langkah} Temp : integer.

….2. Var I : integer. algoritma pengurutan iminimum dapat ditulis secara global sebagai berikut : Untuk setiap pass kei=1.2 Selection Sort ( Pengurutan Pilih) Konsep dari metode ini adalah memilih elemen maksimum/iminimum dari larik. yaitu 1. Seperti pada pengurutan gelembung. proses memilih nilai maksimum/minimum dilakukan pada setiap pass.N:integer). Procedure urutgelembung2_desscending(var L:larik. Algoritma pengurutan maksimum. L[J-1] := Temp. Ada dua variasi algoritma pengurutan pilih ditinjau dari pemilihan elemen maksimum/iminimum. End. L[J-1] := Temp. lalu menempatkan elemen maksimum/iminimum itu pad awal atau akhir larik (elemen terujung). Temp := L[J]. End. 2.N:integer). Jika larik berukuran N.1 Algoritma Pengurutan Iminimum Untuk mendapatkan larik yang terurut menaik. L[J] := L[J+1]. 6. {pencacah untuk pengapungan pada setiap langkah} Temp : integer. yaitu memilih elemen maksimum sebagai basis pengurutan. {peubah bantu pertukaran} Begin For I := 1 to n-1 do For J := 1 to n-1 do If L[J] > L[J+1] then {pertukaran L[J] dengan L[J+1]. Rincian setiap pass adalah sebagai berikut : . yaitu memilih elemen iminimum sebagai basis pengurutan. Temp := L[J]. Tukarkan imin dengan elemen ke-I. L[J] := L[J+1].2. {pencacah untuk jumlah langkah} J : integer. {pencacah untuk jumlah langkah} J : integer. {peubah bantu pertukaran} Begin For I := 1 to n-1 do For J := 1 to n-1 do If L[J] < L[J+1] then {pertukaran L[J] dengan L[J+1].N-1 lakukan : 1. cari elemen terkecil (imin) mulai dari elemen ke-I sampai elemen keN. maka jumlah pass adalah N-1. Proses yang sama di ulang untuk elemen larik yang tersisa yaitu elemen maksimum/iminimum berikutnya dan menukarkannya dengan elemen terujung larik sisa. 2. Var I : integer. 6.8 Pass 3 12 1 12 1 12 1 06 1 06 1 42 2 18 2 06 2 12 2 12 2 18 3 06 3 18 3 18 3 18 3 06 4 42 4 42 4 42 4 42 4 44 5 44 5 44 5 44 5 44 5 55 6 55 6 55 6 55 6 55 6 67 7 67 7 67 7 67 7 67 7 94 8 94 8 94 8 94 8 94 8 Pass 4 Pass 5 Pass 6 Pass 7 Procedure urutgelembung2_ascending(var L:larik. Algoritma pengurutan iminimum. {pencacah untuk pengapungan pada setiap langkah} Temp : integer. Selanjutnya elemen terujung tersebut diisolasi dantidak disertakan pada proses selanjutnya.

Pass N-1 : Cari elemen terkecil di dalam L[N-1. diperoleh : 06 55 12 42 94 18 44 67 1 2 3 4 5 6 7 8 Pass 2 : (berdasarkan susunan larik hasil pass 1) Cari elemen terkecil di dalam larik [2. diperoleh : 06 12 55 42 94 18 44 67 1 2 3 4 5 6 7 8 Pass 3 : (berdasarkan susunan larik hasil pass 2) Cari elemen terkecil di dalam larik [3. L[imin] = 67. L[imin] =06.N]. L[imin] = 12. Pass 2 : Cari elemen terkecil di dalam L[2.8] => Imin = 8. (elemen yang tersisa adalah L[N].. Tukarkan elemen terkecil dengan elemen L[N-1].N].8] => Imin = 6. {pencacah untuk jumlah langkah} J : integer. For J := i+1 to N do If L[imin] > L[J] then imin := J. diperoleh : 06 12 18 42 94 55 44 67 1 2 3 4 5 6 7 8 Pass 5 : (berdasarkan susunan larik hasil pass 4) Cari elemen terkecil di dalam larik [5.. Tukar L[Imin] dengan L[3]. tidak perlu di urut karena hanya satu-satunya) Contoh : 44 55 12 42 94 18 06 67 1 2 3 4 5 6 7 8 Pass 1: Cari elemen terkecil di dalam larik L[1. diperoleh : 06 12 18 42 44 55 67 94 1 2 3 4 5 6 7 8 Selesai. diperoleh : 06 12 18 42 94 55 44 67 1 2 3 4 5 6 7 8 Pass 4 : (berdasarkan susunan larik hasil pass 3) Cari elemen terkecil di dalam larik [4... L[imin] = 42.. diperoleh : 06 12 18 42 44 55 94 67 1 2 3 4 5 6 7 8 Pass 6 : (berdasarkan susunan larik hasil pass 5) Cari elemen terkecil di dalam larik [6. Larik L sudah terurut menaik !!! Procedure urutpilihimin_ascending(var L:larik. Pass 3 : Cari elemen terkecil di dalam L[3.9 Pass 1 : Cari elemen terkecil di dalam L[1. Tukarkan elemen terkecil dengan elemen L[2].. L[imin] = 18. algoritma pengurutan iminimum dapat ditulis sebagai berikut : .N:integer). Tukar L[imin] dengan L[1].8] => Imin = 6. End. Tukar L[Imin] dengan L[6] (sebenarnya tidak perlu dilakukan sebab 55 sudah berada pada posisi yang tepat). Tukarkan elemen terkecil dengan elemen L[3]. {peubah bantu pertukaran} imin : integer. End. Tukar L[Imin] dengan L[4] (sebenarnya tidak perlu dilakukan sebab 42 sudah berada pada posisi yang tepat).. diperoleh : 06 12 18 42 44 55 94 67 1 2 3 4 5 6 7 8 Pass 7 : (berdasarkan susunan larik hasil pass 6) Cari elemen terkecil di dalam larik [7. End..N]. L[imin] = 55. Tukarkan elemen terkecil dengan elemen L[1]. Tukar L[Imin] dengan L[5]. {pencacah untuk pengapungan pada setiap langkah} Temp : integer. L[imin] = 44.8] => Imin = 3.8] => Imin = 4. L[imin] := temp. {elemen iminimum} Begin For i := 1 to n-1 do Begin imin:=i.. Untuk mendapatkan larik yang terurut menurun..8] => Imin = 7. L[i] := L[imin]. Tukar L[Imin] dengan L[7]. Var i : integer. Tukar L[Imin] dengan L[2]. Begin temp := L[i].8] => Imin = 7.N].

L[imin] = 44. End. Tukar L[Imin] dengan L[7]. Tukar L[Imin] dengan L[4].N-2].4] => Imin = 1.10 Rincian setiap pass adalah sebagai berikut : Pass 1 : Cari elemen terkecil di dalam L[1. Tukar L[Imin] dengan L[2] (sebenarnya tidak perlu dilakukan. karena 18 sudah berada pada posisi yang tepat). For I := 1 to n-1 do Begin Imin:=1.. diperoleh : 94 55 67 44 42 18 12 06 1 2 3 4 5 6 7 8 Pass 6: (berdasarkan susunan larik hasil pass 5) Cari elemen terkecil di dalam larik [1. L[imin] = 12.6] => Imin = 6. Temp := L[U]. . Pass 3 : Cari elemen terkecil di dalam L[1.2] => Imin = 2. U:=U-1.{indeks ujung kiri bagian larik yang telah terurut} Temp : integer. End. diperoleh : 44 55 67 42 94 18 12 06 1 2 3 4 5 6 7 8 Pass 3: (berdasarkan susunan larik hasil pass 2) Cari elemen terkecil di dalam larik [1. karena 67 sudah berada pada posisi yang tepat). L[U] := L[imin].N:integer).. Tukarkan elemen terkecil dengan elemen L[N-1].. diperoleh : 94 67 55 44 42 18 12 06 1 2 3 4 5 6 7 8 Selesai. diperoleh: 44 55 12 42 94 18 67 06 1 2 3 4 5 6 7 8 Pass 2: (berdasarkan susunan larik hasil pass 1) Cari elemen terkecil di dalam larik [1. L[imin] = 67. {pencacah untuk pengapungan pada setiap langkah} U : integer. L[imin] := temp. Tukar L[Imin] dengan L[6] (sebenarnya tidak perlu dilakukan. Larik L sudah terurut menaik !!! Procedure urutpilihmin_descending(var L:larik. Tukarkan elemen terkecil dengan elemen L[2]. Var I : integer.N-1]. diperoleh : 44 55 67 94 42 18 12 06 1 2 3 4 5 6 7 8 Pass 5: (berdasarkan susunan larik hasil pass 4) Cari elemen terkecil di dalam larik [1..8] => Imin = 7. tidak perlu di urut karena hanya satu-satunya) Contoh : 44 55 12 42 94 18 06 67 1 2 3 4 5 6 7 8 Pass 1:Cari elemen terkecil di dalam larik L[1. {pencacah untuk jumlah langkah} J : integer. Pass 2 : Cari elemen terkecil di dalam L[1.. L[imin] = 18.. Tukar L[imin] dengan L[N] yaitu L[8].7] => Imin = 3. diperoleh : 94 67 55 44 42 18 12 06 1 2 3 4 5 6 7 8 Pass 7: (berdasarkan susunan larik hasil pass 6) Cari elemen terkecil di dalam larik [1. {peubah bantu pertukaran} Imin : integer. Pass N-1 : Cari elemen terkecil di dalam L[1. diperoleh : 44 55 67 42 94 18 12 06 1 2 3 4 5 6 7 8 Pass 4: (berdasarkan susunan larik hasil pass 3) Cari elemen terkecil di dalam larik [1... L[imin] =06. Tukar L[Imin] dengan L[5]. For J := I+1 to N do If L[imin] > L[J] then imin := J..3] => Imin = 2. L[imin] = 55.N].2].5] => Imin = 4... L[imin] = 42. {elemen iminimum} Begin U:=N. (elemen yang tersisa adalah L[1]. Tukar L[Imin] dengan L[3]. Tukarkan elemen terkecil dengan elemen L[N]. Tukarkan elemen terkecil dengan elemen L[N-2].

diperoleh : 06 18 12 42 44 55 67 94 1 2 3 4 5 6 7 8 Pass 6: (berdasarkan susunan larik hasil pass 5) Cari elemen terbesar di dalam larik [1.. Tukarkan elemen terbesar dengan elemen L[2]. Tukarkan elemen terbesar dengan elemen L[N-1].. Tukar L[Imaks] dengan L[3]. Tukar L[Imaks] dengan L[7].N-2]. Tukar L[imaks] dengan L[N] yaitu L[8]. algoritma pengurutan maksimum dapat ditulis sebagai berikut : Pass 1 : Cari elemen terbesar di dalam L[1.8] => Imaks = 5.6] => Imaks = 2.2. diperoleh : 44 55 12 42 67 18 06 94 1 2 3 4 5 6 7 8 Pass 2: (berdasarkan susunan larik hasil pass 1) Cari elemen terbesar di dalam larik [1. tidak perlu di urut karena hanya satu-satunya) Contoh : 44 55 12 42 94 18 06 67 1 2 3 4 5 6 7 8 Pass 1: Cari elemen terbesar di dalam larik L[1.7] => Imaks = 5.. karena 12 sudah berada pada posisi yang tepat).N]..... L[imaks] = 67.. diperoleh : 44 55 12 42 06 18 67 94 1 2 3 4 5 6 7 8 Pass 3: (berdasarkan susunan larik hasil pass 2) Cari elemen terbesar di dalam larik [1. (elemen yang tersisa adalah L[1].2] => Imaks = 2. diperoleh : 06 12 18 42 44 55 67 94 1 2 3 4 5 6 7 8 Selesai. karena 42 sudah berada pada posisi yang tepat).2].2 Algoritma Pengurutan Maksimum Untuk mendapatkan larik yang terurut menaik. Pass N-1 : Cari elemen terbesar di dalam L[1..4] => Imaks = 4. Pass 3 : Cari elemen terbesar di dalam L[1. diperoleh : 06 12 18 42 44 55 67 94 1 2 3 4 5 6 7 8 Pass 7: (berdasarkan susunan larik hasil pass 6) Cari elemen terbesar di dalam larik [1. Pass 2 : Cari elemen terbesar di dalam L[1. Tukar L[Imaks] dengan L[6]. Larik L sudah terurut menaik !!! . L[imaks] = 42. L[imaks] =94. L[imaks] = 18 . L[imaks] = 44 .5] => Imaks = 1. L[imaks] = 12.. Tukar L[Imaks] dengan L[2] (sebenarnya tidak perlu dilakukan.11 6. L[imaks] = 55. diperoleh : 06 18 12 42 44 55 67 94 1 2 3 4 5 6 7 8 Pass 5: (berdasarkan susunan larik hasil pass 4) Cari elemen terbesar di dalam larik [1. Tukarkan elemen terbesar dengan elemen L[N-2]. Tukar L[Imaks] dengan L[4] (sebenarnya tidak perlu dilakukan. Tukarkan elemen terbesar dengan elemen L[N]. diperoleh : 44 18 12 42 06 55 67 94 1 2 3 4 5 6 7 8 Pass 4: (berdasarkan susunan larik hasil pass 3) Cari elemen terbesar di dalam larik [1.N-1].3] => Imaks = 2.. Tukar L[Imaks] dengan L[5].

Tukar L[Imaks] dengan L[7]. diperoleh : 94 67 55 44 42 18 06 12 1 2 3 4 5 6 7 8 Pass 7: (berdasarkan susunan larik hasil pass 6) Cari elemen terbesar di dalam larik [7. diperoleh : 94 67 55 42 44 18 06 12 1 2 3 4 5 6 7 8 Pass 4 : (berdasarkan susunan larik hasil pass 3) Cari elemen terbesar di dalam larik [4.N].8] => Imaks = 5. L[imaks] = 55. Tukar L[Imaks] dengan L[2].. Untuk mendapatkan larik yang terurut menurun. L[imaks] =94. Pass 2 : Cari elemen terbesar di dalam L[2. {peubah bantu pertukaran} imax : integer. diperoleh : 94 67 55 44 42 18 06 12 1 2 3 4 5 6 7 8 Pass 5: (berdasarkan susunan larik hasil pass 4) Cari elemen terbesar di dalam larik L[5... Tukarkan elemen terbesar dengan elemen L[3].{indeks ujung kiri bagian larik yang telah terurut} Temp : integer.N]... {elemen maksimum} Begin U:=N. karena 94 sudah berada pada posisi yang tepat). Begin Temp := L[U]. Tukarkan elemen terbesar dengan elemen L[1]. Var I : integer. U:=U-1.. Tukarkan elemen terbesar dengan elemen L[N-1]. Tukar L[Imaks] dengan L[3]. algoritma pengurutan maksimum dapat ditulis sebagai berikut : Pass 1 : Cari elemen terbesar di dalam L[1. For I := 1 to n-1 do Begin iMax :=1. Pass 3 : Cari elemen terbesar di dalam L[3. End.. tidak perlu di urut karena hanya satu-satunya) Contoh : 44 55 12 42 94 18 06 67 1 2 3 4 5 6 7 8 Pass 1: Cari elemen terbesar di dalam larik L[1. diperoleh : 94 67 55 44 42 18 06 12 1 2 3 4 5 6 7 8 Pass 6: (berdasarkan susunan larik hasil pass 5) Cari elemen terbesar di dalam larik L[6.. Tukar L[Imaks] dengan L[4]. L[imaks] = 67.L[imaks] = 18. Tukar L[imaks] dengan L[6] (sebenarnya tidak perlu dilakukan. diperoleh : 94 55 12 42 44 18 06 67 1 2 3 4 5 6 7 8 Pass 2: (berdasarkan susunan larik hasil pass 1) Cari elemen terbesar di dalam larik [2. {pencacah untuk pengapungan pada setiap langkah} U : integer. Tukar L[imaks] dengan L[1] (sebenarnya tidak perlu dilakukan.8] =>Imaks= 6.L[imaks] = 42. karena 18 sudah berada pada posisi yang tepat). Tukarkan elemen terbesar dengan elemen L[2]. Tukar L[imaks] dengan L[5] (sebenarnya tidak perlu dilakukan. End. L[imaks] = 44. (elemen yang tersisa adalah L[N]. L[imaks] = 12. Pass N-1 : Cari elemen terbesar di dalam L[N-1. End.8] => Imaks = 1..8] =>Imaks= 5. L[imax] := temp. L[U] := L[imax].8] => Imaks = 8.. karena 42 sudah berada pada posisi yang tepat). {pencacah untuk jumlah langkah} J : integer.N:integer).12 Procedure urutpilihmaks_ascending(var L:larik. diperoleh : .N].8] => Imaks = 8.N]. diperoleh : 94 67 12 42 44 18 06 55 1 2 3 4 5 6 7 8 Pass 3: (berdasarkan susunan larik hasil pass 2) Cari elemen terbesar di dalam larik [3.. For J := i+1 to N do If L[J] > L[imax] then imax := J.8] => Imaks = 8.

..2] ke kanan (atau ke bawah. yaitu L[1] <= L[2} <=…<= L[N]. Misalkan posisi yang tepat adalah K.N] sudah terurut. Misalkan posisi yang tepat adalah K. Contoh : 44 55 12 42 94 18 06 67 1 2 3 4 5 6 7 8 Andaian ( Pass 1 ) :Elemen x = L[1] dianggap sudah terurut. 6. 3 Insertion Sort ( Pengurutan Sisip) Untuk mendapatkan larik yang terurut menaik .3].. L[imax] := temp. {pencacah untuk pengapungan pada setiap langkah} U : integer.1] lebih besar daripada L[2]. jika anda membayangkan larik terentang vertikal) bila L[1..i = 2…N lakukan : 1. Pass N : x = L[N] harus dicari tempatnya yang tepat pada L[1.. Larik L sudah terurut menurun !!! 12 7 06 8 Procedure urutpilihmaks_descending(var L:larik. algoritma pengurutan sisip dapat ditulis secara global sebagai berikut : Untuk setiap pass ke.N:integer).Hasil dari pass N : Larik L[1. diperoleh : .. jika anda membayangkan larik terentang vertikal) bila L[1. End..{indeks ujung kiri bagian larik yang telah terurut} Temp : integer.2]. L[i] := L[imax]..N-1] ke kanan (atau ke bawah. {pencacah untuk jumlah langkah} J : integer.13 94 67 55 44 42 18 1 2 3 4 5 6 Selesai. Misalkan posisi yang tepat adalah K. Begin Temp := L[i]. {elemen maksimum} Begin For I := 1 to n-1 do Begin imax := i.. diperoleh : 12 44 55 42 94 18 06 67 1 2 3 4 5 6 7 8 Pass 4: (berdasarkan susunan larik pada pass 3) Cari posisi yang tepat untuk x = L[4] pada L[1.3] dengan cara menggeser elemen L[1.1] ke kanan (atau ke bawah.2] dengan cara menggeser elemen L[1.4]. Sisipkan L[3] pada L[K]. jika anda membayangkan larik terentang vertikal) bila L[1. diperoleh : 44 55 12 42 94 18 06 67 1 2 3 4 5 6 7 8 Pass 3: (berdasarkan susunan larik pada pass 2) Cari posisi yang tepat untuk x = L[3] pada L[1.N] dengan cara menggeser elemen L[1. Sisipkan L[3] pada L[K].2] lebih besar daripada L[3].N-1] lebih besar daripada L[N].. {peubah bantu pertukaran} imax : integer.. 2. x  L[i] sisipkan x pada tempat yang sesuai antara L[1]…L[i] Rincian setiap pass adalah sebagai berikut : Andaian (pass 1) : L[1] dianggap sudah pada tempatnya Pass 2 : x = L[2] harus dicari tempatnya yang tepat pada L[1. Pass 3 : x = L[3] harus dicari tempatnya yang tepat pada L[1. End. For J := I+1 to N do If L[J] > L[imax] then imax := J. End. Sisipkan L[2] pada L[K].. Var I : integer. 44 55 12 42 94 18 06 67 1 2 3 4 5 6 7 8 Pass 2: (berdasarkan susunan larik pada pass 1) Cari posisi yang tepat untuk x = L[2] pada L[1..

while ( j >= 1) and (not ketemu) do Begin If x < L[j] then Begin L[j+1] := L[j].Setiap leaf (daun) pada binary tree berlevel n atau n+1.6].i-1] sambil menggeser} j := i -1. End Else Ketemu := true. 4 Heap Sort Heap adalah tree biner dengan sifat khusus: . . {pencacah untuk jumlah langkah} J : integer. maka peletakannya adalah : .7]. diperoleh : 12 42 44 55 94 18 06 67 1 2 3 4 5 6 7 8 Pass 6: (berdasarkan susunan larik pada pass 5) Cari posisi yang tepat untuk x = L[6] pada L[1. {pencacah untuk penelusuran larik} X : integer. 6..5]... End. {cari posisi yang tepat untuk x di dalam L[1. End. dimana peletakan sesuai dengan “level order”.Semua leaf yang berlevel n+1 terletak di sebelah kiri dari leaf yang berlevel n. Dengan demikain Anak-kiri node ke i diletakkan pada node ke 2i Anak-kanan node ke i diletakkan pada node ke 2i+1 Misalnya saja auntuk ilustrasi heap ke 2 pada gambar diats.N:integer). diperoleh : 12 18 06 42 44 55 94 67 1 2 3 4 5 6 7 8 Pass 8: (berdasarkan susunan larik pada pass 8) Cari posisi yang tepat untuk x = L[8] pada L[1.14 12 42 44 55 94 18 06 67 1 2 3 4 5 6 7 8 Pass 5: (berdasarkan susunan larik pada pass 4) Cari posisi yang tepat untuk x = L[5] pada L[1. Representasi binary tree menggunakan cara alokasi sequential. {peubah boolean untuk menyatakan posisi penyisipan ditemukan} Begin { elemen L[1] dianggap sudah terurut} For I := 2 to n do { mulai dari langkah 2 sampai langkah N} Begin x := L[i]. Ilustrasi 25 18 11 18 25 11 18 25 8 4 12 7 10 4 12 7 4 12 7 10 heap heap bukan heap Heap sort adalah metoda pengurutan yang memanfaatkan struktur heap. . L[j+1] := x.8]. Var I : integer. {geser} J := j – 1. diperoleh : 12 18 06 42 44 67 1 2 3 4 5 6 Selesai.Nilai key setiap node selalu lebih besar dari nilai key semua keturunannya. ketemu := false. {peubah bantu agar L[K] tidak ditimpa selama pergeseran} ketemu : boolean... End. diperoleh : 12 18 42 44 55 94 06 67 1 2 3 4 5 6 7 8 Pass 7: (berdasarkan susunan larik pada pass 6) Cari posisi yang tepat untuk x = L[7] pada L[1. Larik L sudah terurut menaik !!! 55 7 94 8 Procedure urutinsert_ascending(var L:larik.

ulangi langkah pertama tahap ke 2. dengan melakukan penukaran tempat dengan anak yang bernialai paling kecil secra berulang-ulang.  kurangi i dengan 1. maka bentuk tetap. sekarang i = 4. . dan ternyata niali kedua anaknya (29 dan 21) > dari nilainya. lebih kecil dari nilai kedua anaknya (23 dan 17). Ubah deretan bilangan yang akan diurutkan menjadi suatu heap. Node anaknya ialah node bernilai 57. Gambar binary tree menjadi : 20 11 21 23 17 9 5 19 4 12  kurangi i dengan 1. Ilustrasi proses digambar dalam bentuk struktur konseptual heap : Misalnya keadaan awal deretan yang akan diurutkan : 20 11 5 23 17 9 21 19 4 12 1 2 3 4 5 6 7 8 9 10 Atau bentuk binary tree ekuivalennya adalah : 20 11 5 23 17 9 21 19 4 12 Tahap ke 1 : Pembentukan heap  i = N/2 (jika pecahan. Nilai node ke i (ke 2) adalah 11. Tukarkan nilai node ke 2 dengan nilai node anaknya yang paling besar (23).  kurangi i dengan 1.Setelah menjadi heap kembali. . maka heap bentuk tetap. dibulatkan ke bawah). Deretan anggota yang dipecat (dari kecil ke besar) merupakan deretan yang terurut. Maka gambarnya : 20 23 21 11 17 9 5 19 4 12 .Pindahkan leaf (daun) yang terakhir pada urutan level oreder. Sebagai akibatnya struktur tidak berupa heap lagi.15 25 18 11 4 12 7 1 2 3 4 5 6 Prinsip prosesnya adalah sbb : Tahap ke 1 : Pembentukan heap awal.Ubahlah menjadi heap kembali. sekarang i = 3. Maka tukarkan nilainya dengan nilai anaknya yang paling besar. Nilai node ke i (ke 3) adalah 5. ternyata 17 > 12. jadi tidak melanggar aturan heap. sekarang i = 2. . untuk kasus diatas berarti i = 5. jadi tidak melanggar aturan heap.“pecat” root dari heap tersebut. jadi tukarkan 5 dengan 21. Elemen ke I pada array adalah node bernilai 17 pada heap. Tahap ke 2 : Sorting Lakukanlah : . Nilai node ke i (ke 4) adalah 12 > dari nilai node anaknya (23 > 19 dan 23 > 4). demikian seterusnya sehingga semua anggota heap habis “dipecat”.

Maka gambarnya sekarang . hasil akhir ini adalah seperti pada gambar sbb : 23 20 21 19 17 9 5 11 4 12 1 2 3 4 5 6 7 8 9 10 Tahap 2 : proses sorting  “Pecat” root heap (niali 23) dan pindahkan leaf yang terakhir pada urutan level order (nilai 12) ke root. ialah 19 yang > dari 11.16 Periksa lagi ke bawah. Maka gambarnya sekarang : 20 23 21 19 17 9 5 11 4 12  kurangi i dengan 1. Gambarnya adalah: 12 20 21 19 17 9 5 11 4 Perhatiakn bahwa anggota tree berkurang 1 (tinggal 9 buah). Nilai node ke i (ke 1) ternyata lebih kecil dari anak-anaknya (23 dan 21). sekarang i = 1. Dalam representasi dengan aloksi sequential. Tukarkan 20 dengan 23 (anak yang terbesar nilainya). maka proses pembentukan heap selesai. Dalam pelaksanaaanya pemecatan dan pemindahan seperti di atas dilakukan pada representasi dengan alokasi sequential dengan cara menukarkan elemen ke 1 dan elemen ke 10 pada array. Maka gambarnya sekarang : 20 12 19 17 9 5 11 4 . sehingga menjadi : 20 1 11 2 5 3 23 4 17 5 9 6 21 7 19 8 4 9 12 10 Bukan anggota binary tree lagi 21 Masih anggota binary tree lagi  Mulailah pembentukan kembali heap dengan cara : Tukar root (12) dengan anak yang bernilai paling besar (21). ternyata ada node anak kiri dari 11. 23 20 21 19 17 9 5 11 4 12 Sekarang 20 sudah lebih beasar dari nilai anak-ankanya (19 dan 17). Tukarkan tempat 11 dengan 19. dan bukan merupakan heap lagi.

tukarkan elemen ke 1 dengan elemen ke 9. apakah kedua anak sudah < 12. jadi tidak perlu ditukarkan lagi. sehingga : 20 19 12 4 17 9 5 11 Atau : 20 1 19 2 12 3 4 4 17 5 9 6 5 7 11 8 21 9 23 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi Pembentukan kembali heap belum selesai.17 Periksa ke bawah (9 dan 5). karena 4 masih < dari anaknya (11). Maka gambarnya sekarang : 4 20 12 19 17 9 5 11 Struktur anggota tinggal 8 buah . dan pindahkan leaf yang terakhir pada urutan level order ke root. Dalam pelaksanaan aktualnya. dalam representasi dengan alokasi sequential gambarnya adalah : 21 20 12 19 17 9 5 11 4 23 1 2 3 4 5 6 7 8 9 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi  “Pecat” kembali root yang baru. Keadaan sekarang : . 4 20 12 19 17 9 5 11 21 23 1 2 3 4 5 6 7 8 9 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi  Mulailah pembentukan kembali heap dengan cara : Tukar root (4) dengan anak yang bernilai paling besar (20). maka tukar 4 dengan 19. dan heap “rusak” kembali menjadi binary tree biasa. Ternyata sudah. maka tukar 4 dengan 11. Maka gambarnya sekarang : 20 4 12 19 17 9 5 11 Atau : 20 1 4 2 12 3 19 4 17 5 9 6 5 7 11 8 21 9 23 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi Perhatikan bahwa 4 < kedua anaknya (baik 19 maupun 17. Sekarang heap sudah terbentuk kembali.

sehingga hasilnya : 19 17 12 11 4 9 5 Atau : 19 1 17 2 12 3 11 4 4 5 9 6 5 7 20 8 21 9 23 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi  “Pecat” kembali root yang baru. dan pindahkan leaf yang terakhir pada urutan level order ke root. Maka gambarnya sekarang : 5 17 12 11 4 9 17  Mulailah pembentukan kembali heap dengan cara : Tukar root (5) dengan anak yang bernilai paling besar (17). maka heap ”rusak” dan bentuknya adalah : 4 19 12 11 17 9 5 Atau : 4 1 19 2 12 3 11 4 17 5 9 6 5 7 20 8 21 9 23 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi  Susun kembali menjadi heap dengan cara seperti yang sudah. dalam representasi dengan alokasi sequentialnya : 20 19 12 11 17 9 5 4 21 23 1 2 3 4 5 6 7 8 9 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi  “Pecat” root (20).18 20 19 12 11 17 9 5 4 Heap sudah terbentuk kembali. Maka gambarnya sekarang : 5 12 11 4 9 .

Maka gambarnya sekarang : 11 4 9 5 Pembentukan kembali heap belum selesai. Maka gambarnya sekarang : 4 11 9 5  Mulailah pembentukan kembali heap dengan cara : Tukar root (4) dengan anak yang bernilai paling besar (11). dan pindahkan leaf yang terakhir pada urutan level order ke root. Keadaan sekarang : 11 5 4 9 . maka tukar 5 dengan 4. dan pindahkan leaf yang terakhir pada urutan level order ke root.19 Pembentukan kembali heap belum selesai. karena 4 masih < dari anaknya (5). Maka gambarnya sekarang : 12 11 9 5 4 Atau : 12 1 11 2 9 3 5 4 4 5 17 6 19 7 20 8 21 9 23 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi  “Pecat” kembali root yang baru. Keadaan sekarang : 17 11 12 5 4 9 Atau : 17 1 11 2 12 3 5 4 4 5 9 6 19 7 20 8 21 9 23 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi  “Pecat” kembali root yang baru. karena 5 masih < dari anaknya (11). Maka gambarnya sekarang : 9 11 12 5 4  Mulailah pembentukan kembali heap dengan cara : Tukar root (9) dengan anak yang bernilai paling besar (12). maka tukar 5 dengan 11.

dan seluruh array ditempati oleh himpunan root yang telah di “pecat” yang sudah terurut. Maka gambarnya sekarang : 9 5 4 Atau : 9 1 5 2 4 3 11 4 12 5 17 6 19 7 20 8 21 9 23 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi  “Pecat” kembali root yang baru. Maka gambarnya sekarang : 5 4 Atau : 5 1 4 2 9 3 11 4 12 5 17 6 19 7 20 8 21 9 23 10 Masih anggota binary tree lagi Bukan anggota binary tree lagi  “Pecat” kembali root yang baru.20 Atau : 11 1 5 2 9 3 4 4 12 5 17 6 19 7 20 8 21 9 23 10  “Pecat” kembali root yang baru. Maka gambarnya sekarang : 4 5  Mulailah pembentukan kembali heap dengan cara : Tukar root (4) dengan anak yang bernilai paling besar (5). dan pindahkan leaf yang terakhir pada urutan level order ke root. Maka gambarnya sekarang : Atau : 4 4 5 9 11 12 17 19 20 21 23 1 2 3 4 5 6 7 8 9 10 Pada akhirnya heap akan “kosong” atau N telah mencapai 0 maka pengurutan selesai. dan pindahkan leaf yang terakhir pada urutan level order ke root. Algoritmanya : {nilai ada pada array X. dan pindahkan leaf yang terakhir pada urutan level order ke root. Maka gambarnya sekarang : 4 Masih anggota binary tree lagi Bukan anggota binary tree lagi 5 9  Mulailah pembentukan kembali heap dengan cara : Tukar root (4) dengan anak yang bernilai paling besar (9). N=jumlah nilai} {Tahap ke 1 : ubah jadi heap} for i = N/2 to 1 step-1 {periksa untuk node i dan selama ada pertukaran teruskan pemeriksaaan ke “bawah”} ki j k+k repeat {pilih anak yang paling besar nilainya} if j < N then if X(j+1) > X(j) then j  j + 1 else endif else endif .

21 { jika anak > ayah. tukar} if X(j) > X(k) then Z  X(j) X(j)  X(k) X(k)  Z Tukar  TRUE Else tukar  FALSE endif {ubah k dan j ke “bawah”} kj {anak jadi ayah} kk+k {posisi anak kirinya} until not(tukar)) or (j>=N) endfor {Tahap ke 2 : Sorting} for i = N to 2 step-1 {“pecat” root /tukar posisi dengan leaf terakhir} Z  X(i) X(i)  X(N-i + 1) X(N – i +1)  Z {susun menjadi heap lagi} ki j k+k repeat {pilih anak yang paling besar nilainya} if j < N then if X(j+1) > X(j) then j  j + 1 endif else endif {jika anak > ayah. Mulai dari j ke arah kiri cari elemen yang < elemen ke 1. Nilai i sekarang = 4. atau 23. Nilai j tetap = 10 Tukarkan elemen ke i dan ke j tersebut . sekaligus akan dilakukan penyusunan sehingga pada akhirnya semua elemen sebelah kiri mempunyai nilai key <. katakanlah elemen ke 1. tukar} if X(j) > X(k) then Z  X(j) X(j)  X(k) X(k)  Z tukar  TRUE else tukar  FALSE endif {ubah k dan j ke “bawah”} kj {anak jadi ayah} jk+k {posisi anak kirinya} until (not (tukar)) or ( j>= N) endfor 6. Sewaktu proses ini berlangsung. atau 12. Ilustrasi : Keadaan awal 20 11 5 23 17 9 21 19 4 12 1 2 3 4 5 6 7 8 9 10 Ambil nilai I=2 dan j=10. dan semua elemen sebelah kanan mempunyai ke yang > key elemen ke 1 tersebut. berhasil ditemui ialah elemen ke 10.5 Quick Sort Motivasi metoda ini adalah meletakkan suatu elemen. Mulai dari i ke arah kanan cari elemen yang > elemen ke 1. . pada posisi yang sudah tetap pada deretan. berhasil ditemui ialah elemen ke 4.

Demikian seterusnya sehingga seluruh bagian kiri akhirnya akan terurut. dihentikan dengan nilai i= 7. tukarkan elemen ke j dengan elemen ke 1. Sedangkan pencarian j berhenti pada nilai j=8. maka lakukan penukaran elemen ke j dengan elemen ke 1. Proses terhadap deretan kiri : 19 11 5 12 17 9 4 1 2 3 4 5 6 7 Ambil nilai i=2 dan j=7. pencarian gagal. 19 1 11 2 5 3 12 4 17 5 9 6 4 7 ij 17 5 9 6 Karena I sudah >= j. Semua elemen sebelah kirinya < 20 dan sebelah kanannya > 20. pencariani i berhasil pada nilai i=9. Mulai dari j ke arah kiri cari elemen yang < elemen ke 1. 20 11 5 12 17 9 4 19 21 23 1 2 3 4 5 6 7 8 9 10 J i Karena i sudah >=j.22 20 1 11 2 5 3 12 4 i 17 5 9 6 21 7 19 8 4 9 23 10 J Ulangi proses. 20 11 5 12 1 2 3 4 4 19 21 23 7 8 9 10 i J Ulangi proses. berhasil ditemui ialah elemen ke 7 atau 4. Prosesnya berturut turut : 4 1 j 11 2 i 11 2 5 3 12 4 17 5 9 6 Pencarian j gagal. 4 11 5 12 17 9 1 2 3 4 5 6 19 7 ij Perhatikan bahwa 19 sudah mendapat posisi finalnya. maka diperoleh I=7 dan j=9 tukarkan. Perhatikan pula bahwa sekarang deretan nilai “terbelah” menjadi 2 bagian. tidak ada pertukaran. bagian “kiri” dan bagian “kanan”. kemudian terhadap deretan kanan. Tinggal bagian kiri (mulai dari elemen ke 1 s/d 6) yang akan diproses lebih lanjut. mula-mula terhadap deretan kiri (sampai tuntas). Mulai dari i kearah kanan cari elemen yang > elemen ke 1. tidak ada pertukaran 17 5 12 17 12 6 Ij . Nilai j tetap = 7. 19 11 5 12 17 9 4 20 21 23 1 2 3 4 5 6 7 8 9 10 J I Partisi kanan Partisi kiri Perhatikan bahwa elemen ke 1 (20) sudah mendapat posisi tetap.. 5 3 12 4 i 9 4 17 5 9 6 J 12 6 Tukar elemen ke j dengan ke i 11 2 5 3 j 11 3 17 5 I 17 5 i Tukar elemen ke j dengan ke 1 9 4 j 12 6 Tukar elemen ke j dengan ke 1 11 4 j 17 5 i 12 6 Pencarian j gagal. Proses selanjutnya ialah mengulang proses semula.

{nilai ada pada array X. Algoritmanya : Dapat dibuat dengan prinsip rekursif ataupun non rekursif. 4 5 9 11 12 1 2 3 4 5 Lakukan Proses terhadap deretan kanan 17 6 Perhatikan bahwa metoda quicksort ini bersifat rekursif. Jika dipilih cara non rekursif diperlukan suatu menyimpan batas-batas bagian yang baru terbentuk. karena proses pembuatan bagian (partisi) dilakukan kembali terhadap bagian yang terbentuk.23 5 6 Selesai . N=jumlah nilai} {simpan batas partisi tunggal pada stack} push_ke_stack(1) push_ke_stack(N) while stack_ada_isinya {ambil batas partisi dari stack} kanan  pull_dari_stack () kiri  pull_dari_stack () j  kanan i  kiri +1 {proses pembuatan partisi} while i < j {cari X(i) yang > X(kiri)} while (X(i) < X(kiri) and (i < j)) do i  i + 1 endwhile {cari X(j) yang < X(kiri)} while (X(j) > X(kiri) and (j < kiri)) do j  j .1 endwhile if i < j then {tukar X(i) dengan X(j)} temp  X(i) X(i)  X(j) X(j)  temp Else endif endwhile if j > kiri then {tukar X(kiri) dengan X(j)} temp  X(kiri) X(kiri)  X(j) X(j)  temp else endif {simpan batas partisi kiri pada stack} if j > (kiri + 1) then push_ke_stack (kiri) push_ke_stack (j-1) else endif {simpan batas partisi kanan ke stack} if j < (kanak-1) then push_ke_stack (j+1) push_ke_stack (kanan) else endif endwhile STACK unutk .

dimulai dari elemen pertama sampai X ditemukan atau seluruh elemen larik L sudah diperiksa. 7. ketemu := false.1. {maju ke elemen berikutnya} end. 55.N] secara beruntun. 06. idxX berharga 0 jika X tidak ditemukan versi boolean} Var i : integer. Keluaran dari proses ini adalah indeks idxX dimana L[idxX] :=X. End.24 BAB VII SEARCHING (PENCARIAN) 7. mulai dari elemen pertama sampai elemen yang dicari ditemukan atau semua elemen sudah diperiksa. 12. 94 (ditemukan) Indeks larik yang dikembalikan : idx = 4. dimulai dari elemen pertama sampai X ditemukan atau seluruh elemen larik L sudah diperiksa.1 Pencarian Beruntun pada Larik yang Tidak Terurut Pencarian dilakukan dengan memeriksa setiap elemen larik mulai dari elemen pertama sampai elemen yang dicari ditemukan atau sampai seluruh elemen sudah diperiksa. n:integer. 42. 18. 1 Pencarian Beruntun (Sequential Search) Prinsip kerja pencarian beruntun adalah membandingkan setiap elemen larik satu per satu secara beruntun. Begin i := 1. idxX berharga 0 jika X tidak ditemukan} Var i : integer. Misalkan nilai yang dicari adalah X = 44 Maka. {indeks untuk pencarian} ketemu : integer. 94. Contoh : Perhatikan larik L di berikut ini : 44 55 12 42 94 18 06 67 1 2 3 4 5 6 7 8 Misalkan nilai yang dicari adalah X = 94 Maka. Procedure cari runtun_versiboolean(L:larik.N] secara beruntun. End. 55. Algoritma pencarian beruntun sbb : Procedure cari runtun1(L:larik. 67 (tidak ditemukan) Indeks larik yang dikembalikan : idx = 0. n:integer. {indeks untuk pencarian} Begin i := 1. {maju ke elemen berikutnya} end.. elemen yang diperiksa: 44. x:integer. . {periksa selama i < n dan L[i] x} while (i < n) and (L[i] <> x) do begin i := i + 1. 42. x:integer. var idxX:integer).. Pencarian beruntun ada dua macam yaitu : pencarian beruntun pada larik terurut dan pencarian beruntun pada larik tidak terurut. {mencari X di dalam larik L[1. elemen yang diperiksa: 44 (ditemukan) Indeks larik yang dikembalikan : idx = 1. Misalkan nilai yang dicari adalah X = 10 Maka. {i = n atau L[i] = x} {simpulkan hasil pencarian} if (L[i] <> x ) then idxX beruntun versi boolean : Algoritma pencarian:= 0 else idxX := i. {i > n atau ketemu = true} {simpulkan hasil pencarian} if ketemu then idxX := i else idxX := 0. elemen yang diperiksa: 44. {mencari X di dalam larik L[1. var idxX:integer). {periksa selama i <= n dan ketemu masih bernilai false} while (i <= n) and (not ketemu) do begin i f L[i] = x then ketemu := true {hentikan proses pencarian} else i := i + 1. Keluaran dari proses ini adalah indeks idxX dimana L[idxX] :=X. 12.

var idxX:integer). Sentinel ini harganya sama dengan da ta yang di cari. 21. {jumlah maksimum elemen larik} Type Larik = array [1.max+1] of integer. x:integer. (iii) Misalkan elemen yang dicari adalah X = 15. End. Jika X tidak ditemukan. sebab komputer tidak boleh mengakses elemen larik yang indeksnya melebihi rentang indeks yang sudah didefinisikan. 14. Maka tambahkan 13 sebagai elemen sentinel di L [N + 1] : 13 16 14 21 76 21 13 1 2 3 4 5 6 7 Elemen yang diperiksa selama pencarian : 13 Indeks larik yang dikembalikan : 1 Karena 1  N+1 berarti X = 13 terdapat di dalam larik L semula. Begin i := 1.N] secara beruntun dimulai dari elemen pertama sampai X ditemukan atau seluruh elemen larik L sudah diperiksa. 16. {maju ke elemen berikutnya} end. idxX berharga 0 jika X tidak ditemukan} Var i : integer. {indeks untuk pencarian} ketemu : boolean. Perlu diingat batas pendefinisian indeks larik. 15 Indeks larik yang dikembalikan : 7 Karena 7 = N+1 berarti X = 15 tidak terdapat di dalam larik L semula. . maka sentinel tesebut sekaligus sudah ditambahkan. {tipe larik} Procedure cari beruntunsentinel(L:larik. 21. Keluaran dari proses ini adalah indeks idxX dimana L[idxX] :=X. (ii) Misalkan elemen yang dicari adalah X = 13. proses pencarian selalu berhasil menemukan data yang dicari. 21 Indeks larik yang dikembalikan : 4 Karena 4  N+1 berarti X = 21 terdapat di dalam larik L semula. Jika elemen terakhir larik adalah L[N]. ketemu := false. Walaupun demikian harus diperiksa lagi letak data tersebut ditemukan. Akibatnya. {I > N or ketemu = true} if (ketemu) then {X ditemukan} idxX := I else {X tidak ditemukan di dalam larik} idxX := 0. 14.. atau (ii) pada elemen fiktif yaitu L[N + 1] yang berarti X sesungguhnya tidak terdapat di dalam larik L. {mencari X di dalam larik L[1. Maka tambahkan 21 sebagai elemen sentinel di L [N + 1] : 13 16 14 21 76 21 21 1 2 3 4 5 6 7 Elemen yang diperiksa selama pencarian : 13.25 7. Maka tambahkan 15 sebagai elemen sentinel di L [N + 1] : 13 16 14 21 76 21 15 1 2 3 4 5 6 7 Elemen yang diperiksa selama pencarian : 13. 2 Pencarian Beruntun dengan Sentinel Sentinel merupakan elemen fiktif yang sengaja ditambahkan sesudah elemen terakhir larik. apakah : (i) diantara elemen-elemen larik sesungguhnya yaitu dari L[1] sampai L[N]. 16. {periksa selama I <= N dan ketemu masih bernilai false} while (I <= N) and (not ketemu) do begin if (L[I] = X) then ketemu : = true {hentikan proses pencarian} else {L[I] X} I := I + 1. maka sentinel dipasang pada elemen L[N + 1]. n:integer. 76. Perhatikan larik di bawah ini : 13 16 14 21 76 1 2 3 4 5 N = 6 (jumlah elemen larik semula) 21 6 (i) Misalkan elemen yang dicari adalah X = 21. Algoritma Pencarian Beruntun dengan Sentinel Const max : integer = 10. 1..

Syarat utama penerapan pencarian bagi dua adalah data yang sudah terurut (ascending/menaik atau descending/menurun). Indeks terkecil sebagai indeks ujung kiri larik dan terbesar sebgai indeks ujung kanan larik. j:=0. ada := false. ada := true.k-1] dan bagian kanan L[k+1. end else if a[i] > data then {elemen yang dicari tidak ditemukan} begin j := i. pencarian dilakukan pada larik bagian kanan. j : integer. 7. Pencarian Biner /Bagi Dua (Binary Search) Pencarian dua/biner (binary search) merupakan metode pencarian yang diterapkan pada sekumpulan data yang sudah terurut baik secara ascending maupun descending. Salah satu keuntungan data yang terurut adalah memudahkan pencarian dalam hal ini adalah pencarian bagidua. End. ia=1 dan ib=N. {indeks untuk pencarian} Begin i := 1. Langkah 2 : Periksa apakah L[k] = X (X adalah elemen yang dicari dalam larik). letaknya disimpan sebagai peubah posisi. Sebaliknya. Selama proses pencarian diperlukan dua buah indeks larik yaitu indeks terkecil dan indeks terbesar. pencarian dihentikan dan bisa dipastikan bahwa elemen yang dicari memang tidak ditemukan. a[j] := data. {posisi elemen yang baru} i := N-1. Istilah kiri dan kanan dinyatakan dengan membayangkan elemen larik terentang horizontal. jika L[k] > X. Langkah 3 : Ulangi langkah 1 sampai X ditemukan atau ia > ib yaitu ukuran larik sudah nol. data baru tersebut akan disisipkan ke dalam vektor} Var i.1. inc(i). membagi larik menjadi dua bagian. inc (n). data :integer). {elemen vektor bertipe integer. Pada mulanya. harus ditentukan apakah pencarian akan dilakukan pada larik bagian kiri atau bagian kanan. Jika L[k] <> X . Langkah 1 : Bagi dua elemen larik pada elemen tengah. yaitu bagian kiri L[ia.26 7. maka seringkali diperlukan adanya penggeseran terhadap elemen-elemen yang nantinya akan terletak pada subskrib yang lebih besar dari elemen yang dicari.3 Pencarian Beruntun pada Larik yang Terurut Secara singkat proses pencarian pada tabel terurut adalah sebagai berikut : Dimulai dari elemen pertama pada tabel dilakukan pembandingan dengan elemen yang dicari. repeat if a[i] = data then {elemen yang dicari ditemukan} begin posisi := i. . maka pencarian dilakukan pada larik bagian kiri. until (i = n) or ada. {menempatkan elemen baru} end. 2. var ada:boolean. Procedure cari runtun_ascaending(a:larik. end. else {menyisip di tengah} begin for i := n downto j do {menggeser elemen} a[i+1] := a[i]. Jika data yang dicari ditemukan. Misalkan indeks kiri adalah Atas (a) dan indeks kanan adalah Bawah (b). Jika L[k] < X.. Jika L[k] = X. L[k]. Elemen tengah adalah elemen dengan indeks k = (a + b) div 2. Jika elemen dalam tabel masih lebih kecil dari elemen yang dicari.ib]. Elemen tengah.. {menambah ukuran vektor} end. var posisi:integer.var n:integer. if not ada then {data tidak ketemu} begin if j = 0 then {elemen baru menempati subkrib terakhir} a [n+1] := data. Jika tidak ditemukan. Jika elemen yang dicari tidak ditemukan dan kits ingin menyisipkan elemen tersebut pada posisinya yang tepat. pencarian dihentikan karena X ditemukan.

27 Contoh pencarian biner : Misalakan diberikan larik L.1 = 6 –1 = 5 42 5 : Langkah 1’’ : ia = 5 dan ib= 5 Indeks elemen tengah k = (5 + 5) div 2 =5 (diarsir) 42 5 : . Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan dengan pemeriksaan sbb : L[6] > 42? Tidak. pencarian dihentikan). Lakukan pencarian pada larik bagian kanan dengan ia = k + 1 = 4 +1 = 5 dan ib = 8 (tetap) 42 ia=5 Langkah 1’ : ia = 5 dan ib = 8. dengan 8 elemen yang sudah terurut descending seperi berikut : 94 ia=1 67 2 55 3 44 4 42 5 18 6 12 7 06 ib=8 (i) Misalkan elemen yang di cari adalah X = 44. Langkah 1 : ia = 1 dan ib = 8. Indeks elemen tengah k = (1 + 8) div 2 = 4 (diarsir) 94 1 Langkah 2 : 67 2 kiri 55 3 44 4 42 5 18 6 kanan 12 7 06 8 L[4] = 44 ? Ya. Langkah 1 : ia = 1 dan ib = 8. Lakukan pencarian pada larik bagian kiri dengan ia = 5 (tetap) dan ib = k . Indeks elemen tengah k = (5 + 8) div 2 = 6 (diarsir) 42 5 Langkah 2’ : Kiri’ 18 6 12 7 Kanan’ 06 8 18 6 12 7 06 ib=8 L[6] = 42 ? Tidak. Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan dengan pemeriksaan sbb : L[4] > 42? Ya. (ii) Misalkan elemen yang di cari adalah X = 42. Indeks elemen tengah k = (1 + 8) div 2 = 4 (diarsir) 94 ia=1 Langkah 2 : 67 2 kiri 55 3 44 4 42 5 18 6 kanan 12 7 06 ib=8 L[4] = 42 ? Tidak. (X ditemukan.

28 Langkah 2’’ L[5] = 42 ? Ya.1 = 2 –1 = 1 94 1 : Langkah 1’’ : ia = 1 dan ib= 1 Indeks elemen tengah k = (1 + 1) div 2 =1 (diarsir) 94 1 : Langkah 2’’ :: L[1] = 97 ? Tidak. Langkah 1 : ia = 1 dan ib = 8. Jadi. Algoritma pencarian bagidua (biner) . Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan dengan pemeriksaan sbb : L[1] > 97? Tidak. Indeks elemen tengah k = (1 +3) div 2 = 2 (diarsir) 67 2 55 ib=3 55 3 44 4 42 5 18 6 kanan 12 7 06 ib=8 94 1 Kiri’ Langkah 2’ : 67 2 55 3 Kanan’ L[2] = 97 ? Tidak. X tidak ditemukan di dalam larik . Lakukan pencarian pada larik bagian kiri dengan ia = 1 (tetap) dan ib = k . Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan dengan pemeriksaan sbb : L[2] > 97? Tidak. Indeks elemen tengah k = (1 + 8) div 2 = 4 (diarsir) 94 ia=1 67 2 kiri Langkah 2 : L[4] = 97 ? Tidak. pencarian dihentikan. Harus diputuskan apakah pencarian akan dilakukan di bagian kiri atau bagian kanan dengan pemeriksaan sbb : L[4] > 97? Tidak. Lakukan pencarian pada larik bagian kiri dengan ia = 1 (tetap) dan ib = k – 1 = 4 – 1= 3 94 ia=1 Langkah 1’ : ia = 1 dan ib = 3.1 = 1 – 1 = 0 karena ia > ib. maka tidak ada lagi bagian larik yang tersisa. Lakukan pencarian pada larik bagian kiri dengan ia = 1 (tetap) dan ib = k . pencarian dihentikan) (iii) Misalkan elemen yang di cari adalah X = 97. (X ditemukan.

Karena 2log(N) < N untuk N yang besar. Keluaran dari proses ini adalah indeks idxX dimana L[idxX] :=X. End.29 Procedure cari binerdescending(L:larik. hanya perlu mengganti If (L[k] > X ) then dengan If (L[k] < X ) then Untuk larik berukuran N elemen algoritma pencarian beruntun melakukan pembandingan elemen larik sebanyak N kali.jgdi . set indeks ujung kiri larik yang baru} ia : = k + 1 else ib : = k – 1. ib. ketemu := false. while (not ketemu) and (ia <= ib) do begin k := (ia + ib) div 2. k : integer. algoritma pencarian biner melakukan pembandingan elemen larik sebanyak 2log(N) kali. x:integer.N] yang sudah terurut menaik dengan metode pencarian biner. {bagidua larik L pada posisi k} if (L[k] = X) then ketemu : = true else {L[k] X} if (L[k] > X) then {akan dilakukan pencarian pada larik begian kanan. {ketemu = true or ia > ib} if (ketemu) then {X ditemukan} idxX := k else {X tidak ditemukan di dalam larik} idxX := 0. n:integer. idxX berharga 0 jika X tidak ditemukan} Var ia. Untuk pencarian biner pada larik yang sudah terurut menaik. ib := N. var idxX:integer).. maka algoritma pencarian biner lebih cepat daripada algoritma beruntun. Begin ia := 1. end. {mencari X di dalam larik L[1. ketemu : boolean.

Sign up to vote on this title
UsefulNot useful