Algoritma dan struktur data II

(1)

BAB I

PENGENALAN STRUKTUR DATA

DAN ALGORITMA

Tujuan :

1. Mahasiswa memahami apakah yang dimaksud dengan struktur data 2. Mahasiswa memahami apakah yang dimaksud dengan algoritma 3. Mengingat kembali tipe data, procedure, function dalam bahasa Pascal

1.1 Pengenalan Struktur Data

Struktur data adalah sebuah skema organisasi, seperti record dan array, yang diterapkan pada data sehingga data dapat diinterprestasikan dan sehingga operasi- operasi spesifik dapat dilaksanakan pada data tersebut

1.2 Pengenalan Algoritma

Algoritma adalah barisan langkah-langkah perhitungan dasar yang mengubah masukan (dari beberapa fungsi matematika) menjadi keluaran.

Contoh : Perkalian

Input : integer positif a, b Output : a X b

Algoritma perkalian :

Contoh kasus : a = 365, b = 24 Metode 1 : 365 * 24 = 365 + (365 * 23)

= 730 + (365 * 22) …..

= 8760 + (365 * 0) = 8760

Metode 2 : 3 6 5

24

1 4 6 0 7 3 0 8 7 6 0 Manakah algoritma yang lebih baik ?


(2)

Tipe Data

Tipe data yang digunakan dalam Turbo Pascal :

Tipe Sederhana

Tipe sederhana merupakan sebuah perubah hanya dimungkinkan untuk menyimpan sebuah nilai data.

Tipe sederhana terdapat 2 tipe :

1. Tipe Ordinal (; tipe data bernilai bulat), dibagi :

- Tipe integer : tipe data yang tidak mempunyai titik desimal. Tipe integer mempunyai 5 tipe, yaitu:

Tipe Data Jangkauan Memori

Shortint -128 s/d 127 1 Byte

Byte 0 s/d 255 1 Byte

Integer -32768 s/d 32767 2 Byte

Word 0 s/d 65535 2 Byte

Longint -2147483638 s/d 2147483647 4 Byte

- Tipe boolean : tipe data yang mempunyai dua nilai, yaitu True dan False. Operator yang digunakan : and, or atau not.

- Tipe char : digunakan untuk mendefinisikan tipe data yang nilainya merupakan himpunan karakter yang dikenal komputer seperti yang tersaji dalam tabel ASCII. Contoh : ‘A’ ‘B’ ‘C’ ‘1’ ‘ 2’ ‘3’

- Tipe terbilang (enumerated) : karena semua nilainya disebut satu persatu Contoh : Type Hari = (minggu, senin, selasa, rabu, kamis, jumat, sabtu)

Bulan = (januari, febuari, maret, april, mei, juni, juli) - Tipe subjangkauan (sub range)

Bentuk umum

Type pengenal = konstanta1konstanta2

Pengenal = nama type yang akan dideklarasikan Konstanta1 = batas bawah nilai data

Konstanta2 = batas atas nilai data Contoh : Type nilai = 0..100

Tipe Data

Tipe Terstruktur Tipe

Sedarhana

Tipe String Tipe

Terstruktur

Tipe Ordinal Tipe Real

Integer, shortint, longint, boolean, char, byte, word, subjangkauan, terbilang

Larik, Rekaman, Himpunan,


(3)

Kemarau = april..oktober

2. Tipe Real (; tipe data bernilai pecahan) Dalam Pascal terdapat 5 tipe :

Tipe Data Jangkauan Digit Signifikan Memori

Real 2.9e-39 s/d 1.7e38 11-12 6 Byte

Singla 1.5e-45 s/d 3.4e38 7-8 4 Byte

Double 5.0e-324 s/d 1.7e308 15-16 8 Byte

Extended 3.4e-4932 s/d 1.1e4932 19-20 10 Byte

Comp -9.2e18 s/d 9.2e18 19-20 8 Byte

Karakteristik tipe data ordinal :

1. Nilai dari tipe ordinal mempunyai nilai yang berurutan. Masing-masing nilai selain nilai yang pertama mempunyai predecessor dan masing-masing nilai selain nilai yang terakhir mempunyai urutan berikutnya.

2. Fungsi standart ord dapat diterapkan pada sembarang tipe ordinal.

3. Fungsi standart pred digunakan untuk menghasilkan predecessor dari nilai datanya. 4. Fungsi standart succ digunakan untuk menghasilkan successor dari nilai datanya.

Tipe String

Data yang bertipe string adalah tipe data yang berisi sederetan karakter yang banyaknya karakter bisa berubah-ubah sesuai kebutuhan yaitu dari 1 sampai 255 karakter.

Bentuk umum :

Type pengenal = string[panjang] Contoh : Type Nama = string [25]

Jurusan = string[40]

Tipe Terstruktur

Setiap perubah dapat menyimpan lebih dari sebuah data. Ada 4 buah tipe terstruktur, yaitu: 1. Tipe larik (Array)

Larik : tipe terstruktur yang mempunyai komponen dalam jumlah yang tetap dan setiap komponen mempunyai tipe data yang sama, posisi masing-masing komponen dalam larik dinyatakan sebagai nomor index.

Bentuk umum ;

Type Pengenal = array[tipe index] of type Contoh : Var

Nilai = array[1..10] of byte; Gaji = array[1...500] of integer; 2. Tipe rekaman (record)

Record : tipe data unutk menyimpan data berdasarkan objek.

Dalam record, dapat dikumpulkan item data yang masingmasing dapat mempunyai tipe data berbeda-beda. Masing-masing item data disebut dengan field. Dalam komputer dikenal sebagai file (berkas).

Contoh : Type Langganan = Record


(4)

Nama : string[25];

Alamat : string[30];

Kredit : real;

End; Siswa = record

Nama : string[25];

Alamat : string[30];

Kelamin : (L,P);

Kelas : 1..6; Var

Pelanggan : langganan; Mahasiswa : siswa; Type status = (T,P,J);

uang = Record

Nama_pegawai : string [25];

Nip : string[10];

Bagian : string[5];

Case status_peg : status of T : (gaji : integer);

P : (gaji_per_jam, jumlah_jam_lembur, Max_Jam_Minggu, Lembur : integer);

J : (Upah_per_jam, Jumlah_jam_kerja, Jam_lembur : integer);

End;

Var gaji : uang;

Jika akan membaca nama_pegawai dan NIP, maka statement yang kita gunakan adalah :

Readln(gaji.nama_pegawai); Readln(gaji.NIP);

Atau menggunakan statemen with Bentuk umum : with nama_rekaman do Contoh : With gaji do

Begin

Readln(nama_pegawai);

Readln(NIP);

Readln (Bagian);

End; 3. Type himpunan (set)

Meripakan suatu kumpulan dari objek yang mempunayi tipe datayang sama dan urutan penulisannya tidak diperhatikan. Tipe-tipe obyek di dalam set disebut sebagi anggota atau elemen himpunan.

Bentuk umum:

Type pengenal = set of tipe_data; Contoh : Type

Digit = set of 1..9;

Hurufbesar = set of ‘A’..’Z’ Sakit = (pusing,mual,letih); Penyakit = set of sakit; Var

Nilai : digit;


(5)

4. Tipe Berkas (file)

File: kumpulan sejumlah komponen yang bertipe data sama yang jjumlahnya tidak tertentu dan biasanya disimpan dalam suatu media penyimpanan luar.

Bentuk umum :

Type Pengenal = file of pengenal1;

Pengenal : pengenal yang kan dinyatakan sebgai bertipe data berkas. Pengenal1 : tipe data komponen berkas

Contoh :

Const jumlah = 5 Type nilai = record

Namamhs : string[25];

Nim : integer;

Nilaiujian : array[1..jumlah] of integer;

Rata_rata : real;

End;

Daf_nilai = file of nilai; Var

Daftar_nilai = Daf_nilai;

Tipe Pointer (mengacu alamat di memori). Bentuk Umum

Type Pengenal = ^simpul Simpul = tipe

Contoh : Type point = ^data Data = record

Nama_peg : string[30];

Alamat : string [30];

Pekerjaan : string [30]; End;

Var titik : point;

Latihan A

Tentukan tipe data yang tepat untuk variable berikut

1. Buatlah variable dan tentukan typenya untuk varioabel yang menyatakan : a. suhu ruangan

b. nialai mahasiswa dalam bilangan bulat c. nilai indeks mahasiswa

d. nama mahasiswa e. nim mahasiswa

f. apakah seseorang memakai kacamata atau tidak 2. Buatlah larik yang menyimpan 100 nama mahasiswa 3. Buatlah larik yang menyimpan 100 nilai integer


(6)

5. Butalah record untuk menyimpan data mahasiswa berkaitan dengan nama, sesester, cuti, nilai, indeks.

6. Buatlah larik yang berisi 50 data bertipe pada no. 5 diatas

7. Buatlah type data baru yang menyimpan 50 larik data bertipe myfriend dan variable n yang menyatakan jumlah larik yang terisi.

Procedure

Procedure merupakan sekumpulan aksi untuk tujuan tertentu. Contoh nilai a=2, niali b=5. Kita akan melakukan suatu prosedur yang mengakibatkan nilai keduanya saling dirtukar.

Procedure tukar ( var a : integer; var b : integer); {Keadaan awal : nilai a dan b telah diisi suatu bilangan} {Keadaan akhir : nilai a dan b keduanya saling tertukar} Variable

temp : integer; Begin

temp := a; a := b; b := temp; End;

Prosedur berikut ini untuk menampilkan niali dalam larik berdimensi 1 sebanyak 50 elemen. Procedure tampil ( x : array [1..50] of integer);

{Keadaan awal : nilai a dan b telah diisi suatu bilangan} {Keadaan akhir : nilai a dan b keduanya saling tertukar} Variable

i : integer; {variable looping} Begin

For i := 1 to 50 do output (x[i]); End;

Fungsi

Fungsi merupakan bagian program yang menerima masukan dan mengembalikan suatu nilai keluaran.

Ketika di SMA ada fungsi F(x) = 2x + 3, sehingga F(1) = 5. Disini x adalah parameter masukan, 1 merupakan nilai parameter masukan. Hasil dari fungsi iniadalah 5.

Function kuadrat ( x : integer) : integer;

{Fungsi yang menerima bilangan integer dan mengembalikan nilai integer yang merupakan bilangan kuadrat dari nilai masukan }

Variable Begin

Kuadrat := hasil; {return value} End;

Function equal ( a : integer; b : integer) : boolean;

{Fungsi yang menerima 2 bilangan integer a dan b dan mengembalikan nilai true jika keduanya sama, false juka tidak }

Variable Begin


(7)

equal := (a=b); {return value} End;

Latihan B

1. Nyatakan fungsi F(x) =2x + 3 dengan notasi algoritmik.

2. Nyatakan fungsi F(a,b) = 2a + b dengan notasi algoritmik, dengan a dan b adalah integer. 3. Buatlah function suhu yang menerima suatu suhu dan mengmebalikan kata “panas” jika

suhu datas 35 dan kata “dingin” jika suhu 35 atau kurang.

4. Buatlah function index yang menerima nilai ujian mahasiswa dan mengembalikan nilai indeksnya yaitu A jika 80..100, B jika 60..79, C jika 40..59, D jika 20..39, E jika 0..19. 5. Buat prosedur menampilkan bilangan bulat genap antara 1 s/d 200.

Kesimpulan

Struktur data adalah sebuah skema organisasi yang diterapkan pada data sehingga data dapat diinterprestasikan dan sehingga operasi-operasi spesifik dapat dilaksanakan pada data tersebut

Latihan C

1. Masalah aritmatika polinom adalah membuat sekumpulan subrutin manipulasi terhadap polinom simbolis (symbolic Polynomial). Terdapat empat operasi aritmatika polinom dasar antara lain:

a. Penambahan b. Pengurangan c. Perkalian d. Turunan

Representasikan bilangan polinom dengan array dan buatlah subprogram yang melakukan kelima operasi aritmatika di atas.

2. Bilangan kompleks berbentuk a + bi, dimana a dan b adalah bilangan nyata dan i2 = -1. Terdapat empat operasi aritmatika dasar untuk bilangan kompleks, yaitu:

Penambahan : (a+bi) + (c+di) = (a+c) + (b+d)i Pengurangan : (a+bi) - (c+di) = (a-c) + (b-d)i Perkalian : (a+bi) * (c+di) = (ac-bd) + (ad+bc)i

Pembagian : (a+bi) / (c+di) = [(ac+bd) / (a2+b2)] + [(bc-ad)/(c2+d2)]i Tulis program yang membaca dua bilangan kompleks dan simbol operasi yang perlu dilakukan, kemudian lakukan operasi yang diminta.

Gunakan record untuk merepresentasikan bilangan kompleks dan gunakan prosedur untuk implementasi tiap operasi.


(8)

BAB II

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 Tumpukan Buku Gambar 1. Macam-macam tumpukan

Ada 2 operasi paling dasar dari stack yang dapat dilakukan, yaitu :

1. Operasi push yaitu operasi menambahkan elemen pada urutan terakhir (paling atas). 2. 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 2 1 1

1 1

3 2 5 6 N-1 N

1 3 5 6

1 2 N-1 N

Gambar 2. Asumsi-asumsi penyimpanan stack Top

Top


(9)

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

Top=0 Kosong

Top 5

Top 7

5 Top 5

Top 3

5 Top 5

Top=0 Kosong

Push(5) Push(7) Pop Push(3) Pop Pop

Gambar 3. Proses operasi stack

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 isempty yaitu proses pemeriksaan apakah stack dalam keadaan kosong. 3. Proses isfull yaitu proses pemeriksaan apakah stack telah penuh.

4. 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=0 Maks=5 ? ? ? ? Top 1 Top=1 Maks=5 ? ? ? Top 2 1 Top=2 Maks=5 ? ? ? 2 Top 1 Top=3 Maks=5 ? ? ? Top 5 1 Top=2 Maks=5 ? ? Top 8 5 1 Top=3 Maks=5 ? ? 8 Top 5 1 Top=2 Maks=5 Kondisi awal

Push(1) Push(2) Pop Push(5) Push(8) Pop

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

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 menggunakan array dan single linked list, hanya pada bagain ini hanya dibahas stack menggunakan array :


(10)

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.

ƒ maks_elemen yaitu variable yang menunjuk maksimal banyaknya elemen dalam stack.

Dalam bahasa Pascal, pendeklarasiannya adalah : Const max = 100;

Type tstack = record

Top:integer;

maks_elemen:integer;

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;

stack.maks_elemen:=max; end;

3. Operasi IsEmpty

Operasi ini digunakan untuk memeriksa apakah stack dalam keadaan kosong. Operasi ini penting dilakukan dalam proses pop. Ketika suatu stack dalam keadaan kosong, maka proses pop tidak bisa dilakukan. Adapun langkah-langkah operasi ini adalah :

Operasi IsEmpty pada stack yang menggunakan array.

Operasi ini dilakukan hanya dengan memeriksa field top. Jika top bernilai 0 (untuk elemen yang dimulai dengan index 1), maka berarti stack dalam keadaan empty (kosong) yang akan me-return-kan true (1) dan jika tidak berarti stack mempunyai isi dan me-return-kan nilai false (0)

Implementasi dalam bahasa Pascal adalah : function isempty(stack : tstack): boolean; begin

if (stack.top=0) then isempty:= true else

isempty:= false; end;


(11)

Cara penggunaannya adalah :

{Penggunaan isempty dalam statement if} if( isempty(stack) ) ...

4. Operasi IsFull

Operasi ini berguna untuk memeriksa keadaan stack apakah sudah penuh atau belum. Operasi ini akan menghasilkan nilai true (1) jika stack telah penuh dan akan menghasilkan nilai false (0) jika stack masih bisa ditambah. Langkah-langkah untuk operasi ini adalah : Operasi IsFull pada stack yang menggunakan array.

Operasi ini akan memberikan nilai true (1) jika field top sama dengan field maks_elemen (untuk array yang elemennya dimulai dari posisi 1).

Implementasinya dalam bahasa Pascal adalah : function isfull(stack : tstack );

begin

if (stack.top=stack.maks_elemen) then isfull:=true

else

isfull:=false; end;

Cara pemanggilannya adalah :

{penggunaan isfull dalam statement if} if( isfull(stack) ) … { jika stack tidak penuh}

5. 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. Langkah operasi push dalam array adalah dengan :

ƒ Periksa apakah stack penuh (isfull). Jika bernilai false/0 (tidak penuh) maka proses push dilaksanakan dan jika pemeriksaan ini bernilai true/1 (stack penuh), maka proses push digagalkan.

ƒ Proses push-nya sendiri adalah dengan menambah field top dengan 1, kemudian elemen pada posisi top diisi dengan elemen data baru.

Untuk lebih jelas, perhatikan lagi gambar 4 mengenai representasi stack dengan array.. Implementasinya dalam bahasa Pascal adalah :

Procedure push(var stack: tstack; baru:integer); begin

if (isfull(stack)) then begin

stack.top:= stack.top +1;

stack.elemen[stack.top]:=baru; end

else

writeln(‘Stack Full. Push Gagal.’); end;


(12)

Cara penggunaannya adalah :

push(stack,5); {push 5 ke dalam stack}

6. Operasi Pop

Operasi pop adalah salah satu operasi paling dasar dari stack. Operasi ini berguna untuk mengambil elemen terakhir (top) dan kemudian menghapus elemen tersebut sehingga posisi top akan berpindah. Operasi ini biasanya dibuat dalam bentuk function yang me-return-kan nilai sesuai data yang ada di top.

Operasi pop pada stack yang menggunakan array.

Langkah operasi pop pada stack yang menggunakan array adalah terlebih dahulu memeriksa apakah stack sedang keadaan kosong, jika tidak kosong maka data diambil pada posisi yang ditunjuk oleh posisi top, kemudian simpan dalam variable baru dengan nama data, kemudian posisi top0. Untuk lebih jelas perhatikan kembali gambar 4 .

Implementasi operasi ini dalam bahasa Pascal adalah : fuction pop(var stack: tstack): integer;

begin

if(isempty(stack)) then begin

pop:=stack.elemen[stack.top]; stack.top:= stack.top -1;

end else

pop:= 0; end;

Cara pemanggilannya adalah : Var data:integer;

begin

data=pop(stack); end.

4. Aplikasi Stack

1. Konversi Bilangan Desimal ke Bilangan Biner

Contoh nyata implementasi stack adalah proses pengkonversian dari bilangan decimal (basis 10) ke bilangan biner (basis 2).

Algoritmanya adalah :

1. Ambil sisa pembagian variable bilangan dengan angka 2, kemudian simpan dalam variable sisa. Kemudian simpan isi variable sisa ke dalam stack.

2. Bagi variable bilangan dengan angka 2.

3. Ulangi langkah 1 dan 2 selama bilangan tidak 0. Jika variable bilangan telah bernilai 0 maka lanjutkan ke langkah 4,

4. Lakukan perulangan untuk langkah 5 dan 6 selama stack masih mempunyai isi (tidak kosong).

5. ambil (pop) nilai yang ada di stack simpan di variable data. 6. Tulis isi variable data ke layar .


(13)

7. Selesai.

Untuk lebih jelasnya perhatikan operasi konversi dari decimal ke biner dengan variable bilangan yang akan dikonversi adalah 25.

Operasi Representasi Array

Kondisi Awal

Operasi Stack : inisialisasi(&stack)

? 10

? 9

? …

? …

? 4

? 3

? 2

? 1

Top=0 Maks_Elemen=10 Bilangan = 25.

Pembagian : 25 / 2 Sisa = 1

Bilangan = 12 Opeasi Stack : Push(&stack,1)

? 10

? 9

? …

? …

? 4

? 3

? 2

Top 1 1

Top=1 Maks_Elemen=10 Bilangan = 12.

Pembagian : 12 / 2 Sisa = 0

Bilangan = 6 Operasi Stack : Push(&stack,0)

? 10

? 9

? …

? …

? 4

? 3

Top 0 2

1 1

Top=2 Maks_Elemen=10 Bilangan = 6

Pembagian : 6 / 2 Sisa : 0

Bilangan : 3 Opeasi Stack : Push(&stack,0)

? 10

? 9

? …

? …

? 4

Top 0 3

0 2

1 1

Top=3 Maks_Elemen=10 Bilangan = 3

Pembagian : 3 / 2 Sisa : 1

Bilangan : 1 Operasi Stack : Push(&stack,1)

? 10

? 9

? …

? …

Top 1 4

0 3


(14)

1 1 Top=4 Maks_Elemen=10 Bilangan = 1

Pembagian : 1 / 2 Sisa : 1

Bilangan : 0 Operasi Stack : Push(&stack,1)

? 10

? 9

? …

Top 1 …

1 4

0 3

0 2

1 1

Top=5 Maks_Elemen=10

Operasi pembagian variable bilangan dengan angka 2 berakhir di posisi ini karena nilai variable bilangan sudah mencapai 0. Langkah selanjutnya adalah proses menampilkan data biner dari stack, sampai stack habis.

Periksa :

Stack Kosong ? Tidak Opeasi Stack : Data=pop(&stack); Menghasilkan Data=1 Tampilkan variable Data di layar

Di layar : 1

? 10

? 9

? …

1 …

Top 1 4

0 3

0 2

1 1

Top=4 Maks_Elemen=10 Periksa :

Stack Kosong ? Tidak Opeasi Stack : Data=pop(&stack); Menghasilkan Data=1 Tampilkan variable Data di layar

Di layar : 1 1

? 10

? 9

? …

1 …

1 4

Top 0 3

0 2

1 1

Top=3 Maks_Elemen=10 Periksa :

Stack Kosong ? Tidak Opeasi Stack : Data=pop(&stack); Menghasilkan Data=0 Tampilkan variable Data di layar

Di layar : 1 1 0

? 10

? 9

? …

1 …

1 4

0 3

Top 0 2

1 1

Top=2 Maks_Elemen=10 Periksa :

Stack Kosong ? Tidak Opeasi Stack : Data=pop(&stack);

? 10

? 9

? …

1 …


(15)

Menghasilkan Data=0 Tampilkan variable Data di layar

Di layar : 1 1 0 0

0 3

0 2

Top 1 1

Top=1 Maks_Elemen=10 Periksa :

Stack Kosong ? Tidak Opeasi Stack : Data=pop(&stack); Menghasilkan Data=1 Tampilkan variable Data di layar

Di layar : 1 1 0 0 1

? 10

? 9

? …

1 …

1 4

0 3

0 2

1 1

Top=0 Maks_Elemen=10 Periksa :

Stack Kosong ? Ya

Proses pop stack selesai karena stack telah kosong. Itu berarti semua bilangan biner yang disimpan dalam stack telah ditampilkan ke layar.

Pembuktian :

1 * 24 + 1 * 23 + 0 * 22 + 0 * 21 + 1 * 20 = 16 + 8 + 1 = 25.

2. Notasi Polish (Polish Notation)

Dalam operasi aritmatika, dikenal 3 jenis notasi, yaitu : 1. Notasi Infix (menempatkan operator di antara 2 operand)

Contoh : A+B atau C-D atau E * F atau G / H

2. Notasi Prefix (menempatkan operator di depan / sebelum ke-2 operandnya) Contoh : +AB atau –CD atau *EF atau /GH

3. Notasi Postfix (menempatkan operator di belakang/setelah operandnya) Contoh : AB+ atau CD- 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 :

1. Mengubah notasi infix menjadi postfix, kemudian menghitungnya

2. Menggunakan stack sebagai penampung sementara operator dan operandnya.

Algoritma Infix ke Postfix

Dimisalkan Q adalah ekspresi matematika yang ditulis dalam notasi infix dan P adalah penampung ekspresi matematika dalam notasi postfix, maka algoritmanya adalah :

a. Push tanda “(“ ke stack dan tambahkan tanda “)” di sentinel di Q.

b. Scan Q dari kiri ke kanan, kemudian ulangi langkah c s.d f untuk setiap elemen Q sampai stack Q kosong.

c. Jika yang discan adalah operand, maka tambahkan ke P d. Jika yang discan adalah “(“ maka push ke stack

e. Jika yang discan adalah “)” maka pop isi stack sampai ditemukan tanda “(“, kemudian tambahkan ke P sedangkan tanda “(“ tidak disertakanke P.


(16)

ƒ Jika elemen paling atas dari stack adalah operator yang mempunyai tingatan sama atau lebih tinggi dari operator yang discan, maka pop operator tersebut dan tambahkan ke P.

ƒ Push operator tersebut ke stack. g. 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, terdapat 20 simbol yaitu :

Q : A + ( B * C - ( D / E ^ F ) * G ) * H )

No 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Urutan operasinya adalah :

No Simbol Stack Ekspresi P

(

1 A ( A

2 + (+ A

3 ( (+( A

4 B (+( AB

5 * (+(* AB

6 C (+(* ABC

7 - (+(- ABC*

8 ( (+(-( ABC*

9 D (+(-( ABC*D

10 / (+(-(/ ABC*D

11 E (+(-(/ ABC*DE

12 ^ (+(-(/^ ABC*DE

13 F (+(-(/^ ABC*DEF

14 ) (+(- ABC*DEF^/

15 * (+(-* ABC*DEF^/

16 G (+(-* ABC*DEF^/G

17 ) (+ ABC*DEF^/G*-

18 * (+* ABC*DEF^/G*-

19 H (+* ABC*DEF^/G*-H

20 ) ABC*DEF^/G*-H*+

Dari proses di atas didapatkan bahwa postfixnya adalah ABC*DEF^/G*-H*+ 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.

Algoritmanya adalah :

a. Tambahkan tanda “)” pada sentinel di P

b. Scan P dari kiri ke kanan, ulangi langkah c dan d untuk setiap elemen P sampai ditemukan sentinel.

c. Jika yang discan adalah operand, maka push ke stack. d. Jika yang discan adalah operator (sebut opr1), maka

ƒ Pop 1 buah elemen teratas dari stack, simpan dalam variable var1.

ƒ Pop 1 buah elemen teratas dari stack, simpan dalam variable var2.

ƒ Hitung variable (var2 opr1 var1), simpan hasil di variable hitung.

ƒ Push variable hitung ke stack. e. Pop isi stack dan simpan di variable value.


(17)

f. Keluar.

Contoh : P : 5, 2, 6, +, *, 12, 4, /, -

Tambahkan tanda “)”pada sentinel P sehingga P : 5, 2, 6, +, *, 12, 4, /, -, )

Dari P, didapatkan 10 simbol yaitu :

P : 5 2 6 + * 12 4 / - ) No 1 2 3 4 5 6 7 8 9 10 Urutan operasinya adalah :

No Simbol Stack Operasi Perhitungan

1 5 5

2 2 5, 2

3 6 5, 2, 6

4 + 5, 8 var1=6,var2=2,hitung=2 + 6 =8

5 * 40 var1=8,var2=5,hitung=5 * 8 =40

6 12 40, 12

7 4 40, 12, 4

8 / 40, 3 var1=4,var2=12,hitung=12 / 4 = 3

9 - 37 Var1=3,var2=40,hitung=40 – 3 = 37

10 ) Perulangan selesai karena telah mencapai sentinel dan data dalam stack adalah 37 (hasil akhir).


(18)

BAB III

QUEUE (ANTRIAN)

3.1 Pengertian Antrian

Antrian (Queue) merupakan kumpulan data yang mana penambahan elemen hanya bias dilakukan pada suatu ujung yaitu rear /tail / belakang, dan pengha[usan dilakukan melalui ujung yang lainnya yaitu front / head / depan. Antrian disebut FIFO (First In First Out) yaitu elemen yang lebih dulu disisipkan merupakan elemen yang akan lebih dulu diambil.

Operasi-operasi dasar dari sebuah queue adalah :

1. Enqueue : proses penambahan elemen di posisi belakang 2. Dequeue : proses pengambilan elemen di posisi depan

Selain operasi dasar di atas, ada pula operasi-operasi lain yang dapat dilakukan terhadap sebuah queue yaitu :

1. Operasi pemeriksaan queue kosong (fungsi kosong) 2. Operasi pemeriksaan queue penuh (fungsi penuh). 3. Operasi inisialisasi queue (fungsi inisialisasi)

3.2 Karakteristik Antrian

Karakteristik antrian sebagai berikut :

1. Elemen antrian yaitu item-item data yang terdapat di elemen antrian 2. Front (elemen terdepan dari antrian)

3. Tail (elemen terakhir dari antrian) 4. Count (jumlah elemen pada antrian) 5. Status antrian apakah penuh atau kosong.

- Penuh, jika elemen pada antrian mencapai kapasitas maximum antrian. Pada kondisi ini, tidak mungkin dilakukan panambahan ke antrian.

- Kosong, jika tidak ada elemen pada antrian. Pada kondisi ini, tidak mungkin dilakukan pengambilan elemen dari antrian.

3.3 Implementasi Antrian

3.3.1 Dengan menggunakan Array Statis

Keluar A B C D E F Masuk

(a)

Jika ada elemen baru yang akan masuk pada gambar (a), maka ia akan diletakkan disebelah kanan F (gambar (b)). Jika ada elemen yang akan dihapus, maka A akan dihapus lebih dulu (gambar (c)).


(19)

Keluar A B C D E F G H Masuk

(b)

Keluar C D E F G H Masuk

(c) Contoh deklarasi antrian :

Const max = 5

Var antrian : array [1..max] of char; Belakang, depan : integer; x : char;

Dengan menggunakan array, maka overflow dapat terjadi jika antrian telah penuh , sementara masih ingin menambah elemen ke dalam antrina. Dengan mengabaikan adanya overflow, maka penambahan elemen baru yang dinyatakan oleh var x dapat diimplementasikan dengan statemen :

belakang := belakang + 1; antrian [belakang] := x; Operasi penghapusan bias diimplementasikan dengan ;

x := antrian [depan]; depan := depan + 1;

5 5 5 5 E

4 4 D 4 D 4 D

3 3 C 3 C 3 C

2 2 B 2 2

1 1 A 1 1

(a) (b) (c) (d)

Pada gambar (a) posisi depan = 1 dan belakang = 0. Pada gambar (b) keadaan setelah penambahan empat buah elemen dimana posisi depan = 1 dan belakang = 4. Pada gambar (c) keadaan setelah penghapusan dua buah elemen dimana posisi depan = 3 dan belakang = 4. Pada gambar (d) keadaan setelah penambahan dua buah elemen diamana posisi depan = 3 dan belakang = 5.

Jika akan ditambah elemen baru, maka nilai belakang harus ditambah satu menjadi 6. Sedangkan larik antrian tersebut hanya terdiri dari 6 elemen sehingga tidak bias ditambah lagi meskipun sebenarnya larik tersebut masih kosong di dua tempat. Oleh karena itu dilakukan dengan metoda penggeseran dimana jika ada elemen yang dihapus, maka semua elemen lain digeser sehingga antrian selalu dimulai dari depan = 1.

Depan Belakang


(20)

x := antrian [1];

for i := 1 to belakang-1 do begin

antrian [ i] := antrian [i +1]; end;

5 5 5 5

4 4 D 4 4 F

3 3 C 3 3 E

2 2 B 2 D 2 D

1 1 A 1 C 1 C

(a) (b) (c) (d)

Pada gambar (a) posisi depan = 1 dan belakang = 0. Pada gambar (b) keadaan setelah penambahan empat buah elemen dimana posisi depan = 1 dan belakang = 4. Pada gambar (c) keadaan setelah penghapusan dua buah elemen dimana posisi depan = 1 dan belakang = 2. Pada gambar (d) keadaan setelah penambahan dua buah elemen dimana posisi depan = 1 dan belakang = 4.

Cara penggeseran elemen tidak efisien untuk larik berukuran besar. Oleh karena itu dilakukan dengan larik yang menyimpan elemen antrian sebagai larik memutar (circular).

Queue Dengan Circular Array

Jika menggunakan array untuk queue seperti di atas, maka ketika ada proses pengambilan (dequeue) ada proses pergeseran data. Proses pergeseran data ini pasti memerlukan waktu apalagi jika elemen queue-nya banyak. Oleh karena itu solusi agar proses pergeseran dihilangkan adalah dengan metode circular array.

Queue dengan circular array dapat dibayangkan sebagai berikut :

Depan=1 Belakang=4

5 6 7 9

Atau agar lebih jelas, array di atas dapat dibayangkan ke dalam bentuk seperti lingkaran di bawah ini.

7 9

5 6

depan = 1 belakang = 4

1

2

3 4

5

Aturan-aturan dalam queue yang menggunakan circular array adalah :

1. Proses penghapusan dilakukan dengan cara nilai depan (front) ditambah 1 : depan=depan + 1.


(21)

2. Proses penambahan elemen sama dengan linear array yaitu nilai belakang ditambah 1 : belakang=belakang + 1.

3. Jika depan = maks dan ada elemen yang akan dihapus, maka nilai depan = 1.

4. Jika belakang = maks dan depan tidak 1 maka jika ada elemen yang akan ditambahkan, nilai belakang=1

5. Jika hanya tinggal 1 elemen di queue (depan = belakang), dan akan dihapus maka depan diisi 0 dan belakang diisi dengan 0 (queue kosong).

Front dan Tail akan bergerak maju, jika ; 1. Untuk penambahan.

2. Tail sudah mencapai elemen terakhir array akan memakai elemen pertama array yang telah dihapus.

3. Untuk pngahapusan.

4. Front telah mencapai elemen terakhir array, maka akan menuju elemen pertama jika antrian masih berisi elemen.

Keunggulan representasi circular adalah seluruh kapasitas antrian bisa terpakai seleruhnya. Berdasarkan ilustrasi sebelumnya dapat disusun prosedur untuk menambah dan menghapus elemen antrian sebagai berikut ini :

Const max_elemen = 5;

Type antri = array [1..max_elemen] of char; Var antrian : antri;

depan, belakang : integer;

Nilai awal untuk depan dan belakang masing-masing 0. Depan := 0; Belakang := 0;

Proses enqueue data hanya bisa dilakukan jika queue tidak kosong. Ada beberapa hal yang harus diperhatikan ketika akan melakukan enqueue pada circular array, diantaranya adalah : - Kondisi ketika queue masih kosong. Jika ini terjadi, maka posisi depan dan belakang

bernilai 0.

- Ketika ketika nilai belakang sama dengan maks_queue, maka posisi belakang adalah 0. Ini terjadi ketika posisi depan lebih besar dari 0 (pernah ada dequeue).

- Ketika nilai belakang masih lebih kecil dari maks_queue maka posisi belakang ditambah 1 : belakang=belakang+1;

Dari ketentuan-ketentuan di atas dapat diimplementasikan operasi Enqueue-nya dalam bahasa Pascal adalah sebagai berikut :

procedure Enqueue (var q : antri; x : char); begin

if belakang = max_elemen then belakang := 1 else belakang := belakang + 1;


(22)

begin

write (‘ antrian sudah penuh’); belakang := belakang – 1; if belakang = 0 then

belakang :=max_elemen; end

else q[belakang] := x; end;

Sedangkan proses dequeue hanya bisa dilakukan jika queue dalam keadaan tidak kosong. Ada beberapa kondisi yang harus diperhatikan ketika dequeue elemen queue yaitu :

- Kondisi ketika posisi depan sama dengan posisi belakang (queue hanya memiliki 1 elemen) maka nilai depan dan belakang diisi dengan 0 (queue kosong).

- Jika posisi depan sama dengan posisi maks_queue maka posisi depan berpindah ke 1. - Selain itu, posisi depan ditambah dengan 1 : depan=depan+1

Impelementasinya dalam bahasa Pascal adalah :

function dequeue (var q : antri) : char; begin

if (depan=0) and 9belakang=0) then then write (‘ antrian kososng’);

else begin

dequeue := q [depan]; if depan = max_elemen then depan := 1

else

depan := depan + 1; end;


(23)

BAB IV

POHON

Definisi Pohon

“Struktur pohon merupakan kumpulan elemen yang salah satu elemennya disebut akar dan sisa elemennya terpecah menjadi sejumlah himpunan yang saling tidak berhubungan satu sama lainnya yang disebut cabang “.

- Simpul /node /vertex adalah elemen pohon yang berisi informasi/data dan penunjuk percabangan. Pada gambar 1 pohon dengan 15 simpul.

- Tingkat (level) suatu simpul ditentukan dengan pertama kali menentukan akar sebagai bertingkat 1. Jika suatu simpul dinyatakan sebagai tingkat N, maka simpul-simpul yang merupakan anaknya dikatakan berada dalam tingkat N + 1. Ada pula yang menyatakan bahwa akar berada pada tingkat 0 dan simpul-simpul lainnya dinyatakan bertingkat 1 lebih tinggi .

- Derajat (degree) suatu simpul dinyatakan sebagai banyaknya generasi atau turunan dari simpul tersebut. Pada gambar 1 simpul A mempunyai derajad 2, B mempunyai derajad 2, C mempunyai derajad 3. Simpul berderajat 0 disebut dengan daun (leaf). Simpul-simpul F, H, I, J, K, L, N, O berderajad 0, disebut dengan daun. Daun juga sering disebut dengan simpul luar (external node) , sehingga simpul lain kecuali akar juga sering disebut dengan simpul dalam (internal node).

- Tinggi (height) atau kedalaman (depth) dari suatu pohon adalah tingkat maksimum dari simpul dalam pohon tersebut dikurangi dengan 1. Pohon gambar 1 mempunyai tinggi atau kedalaman 4.

- Ancestor suatu simpul adalah semua simpul yang terletak dalam satu jalur dengan dengan simpul tersebut dari akar sampai simpul yang ditinjau. Contoh ancestor dari simpul L adalah A, C, G.

A

B C

F G H

L M

N O

E

J K

D

I

Tingkat 1

Tingkat 2

Tingkat 3

Tingkat 4

Tingkat 5


(24)

- Predecessor adalah simpul yang berada di atas simpul yang ditinjau. Contoh : Predecessor D adalah B.

- Successor adalah simpul yang berada di bawah simpul yang ditinjau. Contoh : Successor D adalah I.

- Descendant adalah seluruh simpul yang terletak sesudah simpul tertentu dan terletak pada jalur yang sama. Contoh : Descendant E adalah J dan K.

- Sibling adalah simpul-simpul yang memiliki parent yang sama dengan simpul yang ditinjau. Contoh : Sibling J adalah K

- Parent adalah simpul yang berada satu level di atas simpul yang ditinjau. Contoh : Parent J adalah E

- Hutan (forest) adalah kumpulan sejumlah pohon yang tidak saling berhubungan. Pada gambar 1 jika simpul A dihapus maka akan diperoleh sebuah hutan.

Struktur data pada bentuk struktur pohon dalam hubungan logiknya atau relasi antara simpul satu dengan simpul lainnya dianalogikan dengan relasi dalam sebuah keluarga atau dalam sebuah garis keturunan.

B,C dan D bersaudara. E,F dan G bersaudara. H dan I bersaudara. A merupakan orang tua (parent ) dari B,C dan D. B merupakan orang tua dari E,F dan G. D merupakan orang tua dari H dan I.

Pohon Biner

Pohon biner (binary tree) bisa didefinisikan sebagai suatu kumpulan simpul yang mungkin kosong atau mempunyai akar dan subpohon yang saling terpisah yang disebut dengan subpohon kiri (left subtree) dan sub pohon kanan ( right tree)

Karakteristik pohon biner yaitu,

- Setiap simpul paling banyak hanya mempunyai dua buah anak. - Derajat tertinggi dari simpul dalam pohon biner adalah dua.

- Banyaknya simpul maksimum pada tingkat N = 2 n-1. Pohonn biner lengkap tingkat 4 mempunyai daun = 8 dan banyaknya simpul yan buakan daun termasuk akar =7.

- Dalam pohon biner dimungkinkan tidak mempunyai simpul.

Pohon biner lengkap (complete binary tree) bertingkat N, adalah sembarang pohon biner yang semua daunnya terdapat pada tingkat N dan semua simpul yang bertingkat lebih kecil dari N selalu mempunyai cabang kiri dan kanan. Gambar dibawah ini merupakan pohon biner tingkat 4 tetapi bukan pohon biner lengkap tingkat 5.

A

B

E F G

D

I H


(25)

Sebuah pohon yang bukan pohon biner bisa diubah menjadi sebuah pohon biner , caranya : - Setiap simpul pohon biner mengandung field-field informasi, pada cabang kiri dan kanan. - Cabang kiri merupakan anak paling kiri dari simpul pada pohon yang bukan biner.

- Sedangkan cabang kanannya merupakan saudara dari simpul pada pohon yang bukan biner.

Membuat Pohon Biner

Algoritma : Simpul yang berisi informasi yang nilainya “lebih besar” dari simpul parent akan diletakkan sebagai cabang kanan, jika “lebih kecil” akan ditempatkan sebagai cabang kiri. KIRI < KANAN.

Contoh : Simpan data H A K C BJ L

Karakter pertama ‘H’ dilatakkan sebagai akar. Karakter ’K’ karena lebih besar dari ‘H’ akan menempati cabang kanan. Karakter ’A’ karena lebih kecil dari ‘H’ akan menempati cabang kiri dari ‘H’. Kemudian, karena karakter ‘C’ lebih kecil dari ‘H’ dan labih besar dari ‘A’, maka ia diletakkan sebagai cabang kanan dari ‘A’. Proses ini berlangsung sama sampai semua masukan diproses.

Tingkat 4 A

B C

F H

E

L M

D

Tingkat 1

Tingkat 2

Tingkat 3

Tingkat 5

P Q

N O

J K

R S T U

H

A K

J L

C


(26)

Simpan data D B F A C E G

Traversal Pohon Biner Traversal pohon biner adalah :

Proses mendatangi setiap simpul dari pohon secara sistematik masing-masing satu kali, dimana pada setiap simpul yang dikunjungi dilakukan suatu proses pengolahan data

Ada 3 cara traversal :

a. Traversal postorder (LRS)

Proses pertama kali bergerak kearah subpohon bagian kiri, selanjutnya subpohon sebelah kanan dan terakhir simpul (simpul root)

b. Traversal inorder (LSR)

Proses dimulai dari subpohon sebelah kiri selanjutnya simpul root dan selanjutnya subpohon sebelah kanan.

c. Traversal preorder ( SLR )

Proses dimulai dari simpul (root) kearah subpohon kiri, selanjutnya bergerak ke subpohon kanan (SLR).

S = proses mengunjungi simpul.

L = bergerak kearah subpohon bagian kiri. R = bergerak kearah subpohon bagian kanan.

Traversal lain (traversal level order)

Kunjungan simpul dimulai dari simpul bertingkat satu, hingga simpul bertingkat n. Contoh :

D

B F

E G

C A

A

B C

F E

D

J I


(27)

Preorder : A B D E C F I K J Postorder : D E B K I J F C A Inorder : D B E A K I F J C Level order : A B C D E F I J K Perbedaan proses

Preorder : proses dilakukan sebelum penelusuran dua bagian pohon. Inorder : proses dilakukan diantara penelusuran dua bagian pohon. Postorder : proses dilakukan setelah penelusuran dua bagian pohon.

Expression Tree

- Simpul daun : operand. - Simpul cabang : operator.

Pandang ekspresi matematik berikut : (A * B + C ) / (D ^ E )

Pohon biner untuk ungkapan aritmetik :

Preorder atau notasi prefix : / + * A B C ** D E

Postorder atau notasi postfix : A B * C + D E ** / Inorder atau notasi infix : A * B + C / D ** E Level order : / + ** * C D E A B

/

+

*

B A

C

^

E D


(28)

BAB V

SORTING (PENGURUTAN)

INTERNAL

Sorting Internal : Proses pengurutan sekelompok data yang berada didalam memori utama komputer. 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.

Sorting Tabel Alamat (Address Table Sorting) : Pengurutan tidak dilakukan secara fisik akan tetapi dengan cara membuat tabel alamat. Sebagai conoth hasil proses :

Kunci Informasi satelit Tabel alamat

1 71 ...

2 23 ...

3 5 ...

4 47 ...

Untuk mempercepat prose, seringkali data kunci diletakkan juga pada tabel alamat, sedangkan informasi satelit tetap terpisah. Proses pengurutannya disebut Sorting Kunci (Key Sorting). Sorting List (List Sorting) : Pengurutan tidak dilakuakn secra fisik, akan tetapi dengan mengubah isi pointer. Sebagai conoth hasil proses :

6.1 Bubble Sort ( Pengurutan Gelembung)

Pada bubble sort setiap iterasi diperiksa dua data yang bersebelahan. Bila urutan tidak dipenuhi ke dua data tersebut saling bertukar tempat. Pada akhir tiap iterasi maka data terkecil yang ada pada sisa tabel telah bergeser ke bagian sebelah kiri /bagian atas dari tabel.

Untuk mendapatkan larik yang terurut menaik, algoritma pengurutan gelembung dapat ditulis sacara global sbb:

Untuk setiap langkah (pass) ke-I=1,2,…,N-1, lakukan : Metode 1 (untuk pengurutan ascending) :

Mulai dari elemen J=N,N-1,…,I+1,lakukan : 1. Bandingkan L[J] dengan L[J-1].

2. 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,N-1,…,2, bandingkan L[J] dengan L[J-1]. Jika L[J] < L[J-1], tukarkan L[J] dengan L[J-1]. Pada akhir langkah 1, elemen L[1] berisi harga minimum pertama.

Kunci Informasi satelit Pointer Head

1 71 ...

2 23 ...

3 5 ...


(29)

Pass 2 : Mulai dari elemen J=N,N-1,…,3, bandingkan L[J] dengan L[J-1]. Jika L[J] < L[J-1], tukarkan L[J] dengan L[J-1]. Pada akhir langkah 2, elemen L[2] berisi harga minimum kedua dan larik L[1..2] terurut, sedangkan L[3..N] belum terurut.

Pass 3 : Mulai dari elemen J=N,N-1,…,4, bandingkan L[J] dengan L[J-1]. Jika L[J] < L[J-1], tukarkan L[J] dengan L[J-1]. ]. Pada akhir langkah 3, elemen L[3] berisi harga minimum ketiga dan larik L[1..3] terurut, sedangkan L[4..N] belum terurut.

Pass N-1 : Mulai dari elemen K=N, bandingkan L[J] dengan L[J-1]. Jika L[J] < L[J-1], tukarkan L[J] dengan L[J-1].

Pada akhir langkah N-1, elemen L[N-1] berisi nilai minimum ke (N-1) danlarik L[1..N-1] terurut menaik(elemen yang tersisa adalah L[N] tidak perlu diurut karena hanya satu-satunya).

Contoh :

44 55 12 42 94 18 06 67 Pass 1 06 44 55 12 42 94 18 67

1 2 3 4 5 6 7 8 Pass 2 06 12 44 55 18 42 94 67

1 2 3 4 5 6 7 8 Pass 3 06 12 18 44 55 42 67 94

1 2 3 4 5 6 7 8 Pass 4 06 12 18 42 44 55 67 94

1 2 3 4 5 6 7 8 Pass 5 06 12 18 42 44 55 67 94

1 2 3 4 5 6 7 8 Pass 6 06 12 18 42 44 55 67 94

1 2 3 4 5 6 7 8 Pass 7 06 12 18 42 44 55 67 94

1 2 3 4 5 6 7 8

Procedure urutgelembung1_ascending(var L:larik;N:integer); Var I : integer; {pencacah untuk jumlah langkah}

J : integer; {pencacah untuk pengapungan pada setiap langkah} Temp : integer; {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]; Temp := L[J];

L[J] := L[J-1]; L[J-1] := Temp; End;


(30)

Metode 2 (untuk pengurutan ascending) : Mulai dari elemen J=1,1,…,N-1,lakukan :

1. Bandingkan L[J] dengan L[J+1].

2. Tukarkan L[J] dengan L[J+1] jika L[J] > L[J+1] Contoh :

44 55 12 42 94 18 06 67 Pass 1 44 12 42 55 18 06 67 94 1 2 3 4 5 6 7 8 Pass 2 12 42 44 18 06 55 67 94

1 2 3 4 5 6 7 8

Pass 3 12 42 18 06 44 55 67 94 1 2 3 4 5 6 7 8 Pass 4 12 18 06 42 44 55 67 94

1 2 3 4 5 6 7 8 Pass 5 12 06 18 42 44 55 67 94

1 2 3 4 5 6 7 8 Pass 6 06 12 18 42 44 55 67 94

1 2 3 4 5 6 7 8 Pass 7 06 12 18 42 44 55 67 94

1 2 3 4 5 6 7 8

Procedure urutgelembung1_descending(var L:larik;N:integer); Var I : integer; {pencacah untuk jumlah langkah}

J : integer; {pencacah untuk pengapungan pada setiap langkah} Temp : integer; {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]; Temp := L[J];

L[J] := L[J-1]; L[J-1] := Temp; End;

Procedure urutgelembung2_ascending(var L:larik;N:integer); Var I : integer; {pencacah untuk jumlah langkah}

J : integer; {pencacah untuk pengapungan pada setiap langkah} Temp : 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]; Temp := L[J];

L[J] := L[J+1]; L[J-1] := Temp; End;


(31)

6.2 Selection Sort ( Pengurutan Pilih)

Konsep dari metode ini adalah memilih elemen maksimum/iminimum dari larik, lalu menempatkan elemen maksimum/iminimum itu pad awal atau akhir larik (elemen terujung). Selanjutnya elemen terujung tersebut diisolasi dantidak disertakan pada proses selanjutnya. Proses yang sama di ulang untuk elemen larik yang tersisa yaitu elemen maksimum/iminimum berikutnya dan menukarkannya dengan elemen terujung larik sisa. Seperti pada pengurutan gelembung, proses memilih nilai maksimum/minimum dilakukan pada setiap pass. Jika larik berukuran N, maka jumlah pass adalah N-1.

Ada dua variasi algoritma pengurutan pilih ditinjau dari pemilihan elemen maksimum/iminimum, yaitu 1. Algoritma pengurutan maksimum, yaitu memilih elemen maksimum sebagai basis

pengurutan.

2. Algoritma pengurutan iminimum, yaitu memilih elemen iminimum sebagai basis pengurutan.

6.2.1 Algoritma Pengurutan Iminimum

Untuk mendapatkan larik yang terurut menaik, algoritma pengurutan iminimum dapat ditulis secara global sebagai berikut :

Untuk setiap pass kei=1,2,…,N-1 lakukan :

1. cari elemen terkecil (imin) mulai dari elemen ke-I sampai elemen keN. 2. Tukarkan imin dengan elemen ke-I.

Rincian setiap pass adalah sebagai berikut : Pass 1 : Cari elemen terkecil di dalam L[1..N].

Tukarkan elemen terkecil dengan elemen L[1]. Pass 2 : Cari elemen terkecil di dalam L[2..N].

Tukarkan elemen terkecil dengan elemen L[2]. Pass 3 : Cari elemen terkecil di dalam L[3..N].

Tukarkan elemen terkecil dengan elemen L[3]. Pass N-1 : Cari elemen terkecil di dalam L[N-1,N].

Tukarkan elemen terkecil dengan elemen L[N-1].

(elemen yang tersisa adalah L[N], tidak perlu di urut karena hanya satu-satunya) Procedure urutgelembung2_desscending(var L:larik;N:integer);

Var I : integer; {pencacah untuk jumlah langkah}

J : integer; {pencacah untuk pengapungan pada setiap langkah} Temp : 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]; Temp := L[J];

L[J] := L[J+1]; L[J-1] := Temp; End;


(32)

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..8] => Imin = 7, L[imin] =06. Tukar L[imin] dengan L[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..8] => Imin = 3, L[imin] = 12. Tukar L[Imin] dengan L[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..8] => Imin = 6, L[imin] = 18. Tukar L[Imin] dengan L[3], 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..8] => Imin = 4, L[imin] = 42. Tukar L[Imin] dengan L[4] (sebenarnya tidak perlu dilakukan sebab 42 sudah berada pada posisi yang tepat), 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..8] => Imin = 7, L[imin] = 44. Tukar L[Imin] dengan L[5], 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..8] => Imin = 6, L[imin] = 55. Tukar L[Imin] dengan L[6] (sebenarnya tidak perlu dilakukan sebab 55 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..8] => Imin = 8, L[imin] = 67. Tukar L[Imin] dengan L[7], diperoleh :

06 12 18 42 44 55 67 94 1 2 3 4 5 6 7 8 Selesai. Larik L sudah terurut menaik !!!


(33)

Untuk mendapatkan larik yang terurut menurun, algoritma pengurutan iminimum dapat ditulis sebagai berikut :

Rincian setiap pass adalah sebagai berikut : Pass 1 : Cari elemen terkecil di dalam L[1..N].

Tukarkan elemen terkecil dengan elemen L[N]. Pass 2 : Cari elemen terkecil di dalam L[1..N-1].

Tukarkan elemen terkecil dengan elemen L[N-1]. Pass 3 : Cari elemen terkecil di dalam L[1..N-2].

Tukarkan elemen terkecil dengan elemen L[N-2]. Pass N-1 : Cari elemen terkecil di dalam L[1..2].

Tukarkan elemen terkecil dengan elemen L[2].

(elemen yang tersisa adalah L[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 terkecil di dalam larik L[1..8] => Imin = 7, L[imin] =06. Tukar L[imin] dengan L[N] yaitu L[8], 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..7] => Imin = 3, L[imin] = 12. Tukar L[Imin] dengan L[7], 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..6] => Imin = 6, L[imin] = 18. Tukar L[Imin] dengan L[6] (sebenarnya tidak perlu dilakukan, karena 18 sudah berada pada posisi yang tepat), diperoleh :

44 55 67 42 94 18 12 06 1 2 3 4 5 6 7 8 Procedure urutpilihimin_ascending(var L:larik;N:integer); Var i : integer; {pencacah untuk jumlah langkah}

J : integer; {pencacah untuk pengapungan pada setiap langkah} Temp : integer; {peubah bantu pertukaran}

imin : integer; {elemen iminimum} Begin

For i := 1 to n-1 do Begin

imin:=i;

For J := i+1 to N do If L[imin] > L[J] then imin := J; Begin

temp := L[i]; L[i] := L[imin]; L[imin] := temp; End;

End; End;


(34)

Pass 4:

(berdasarkan susunan larik hasil pass 3) Cari elemen terkecil di dalam larik [1..5] => Imin = 4, L[imin] = 42. Tukar L[Imin] dengan L[5], 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..4] => Imin = 1, L[imin] = 44. Tukar L[Imin] dengan L[4], 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..3] => Imin = 2, L[imin] = 55. Tukar L[Imin] dengan L[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..2] => Imin = 2, L[imin] = 67. Tukar L[Imin] dengan L[2] (sebenarnya tidak perlu dilakukan, karena 67 sudah berada pada posisi yang tepat), diperoleh :

94 67 55 44 42 18 12 06 1 2 3 4 5 6 7 8 Selesai. Larik L sudah terurut menaik !!!

6.2.2 Algoritma Pengurutan Maksimum

Untuk mendapatkan larik yang terurut menaik, algoritma pengurutan maksimum dapat ditulis sebagai berikut :

Pass 1 : Cari elemen terbesar di dalam L[1..N].

Tukarkan elemen terbesar dengan elemen L[N]. Pass 2 : Cari elemen terbesar di dalam L[1..N-1].

Tukarkan elemen terbesar dengan elemen L[N-1]. Procedure urutpilihmin_descending(var L:larik;N:integer); Var I : integer; {pencacah untuk jumlah langkah}

J : integer; {pencacah untuk pengapungan pada setiap langkah} U : integer;{indeks ujung kiri bagian larik yang telah terurut} Temp : integer; {peubah bantu pertukaran}

Imin : integer; {elemen iminimum} Begin

U:=N;

For I := 1 to n-1 do Begin

Imin:=1; For J := I+1 to N do

If L[imin] > L[J] then imin := J; Begin

Temp := L[U]; L[U] := L[imin]; L[imin] := temp;

U:=U-1;

End; End; End;


(35)

Pass 3 : Cari elemen terbesar di dalam L[1..N-2].

Tukarkan elemen terbesar dengan elemen L[N-2]. Pass N-1 : Cari elemen terbesar di dalam L[1..2].

Tukarkan elemen terbesar dengan elemen L[2].

(elemen yang tersisa adalah L[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..8] => Imaks = 5, L[imaks] =94. Tukar L[imaks] dengan L[N] yaitu L[8], 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..7] => Imaks = 5, L[imaks] = 67. Tukar L[Imaks] dengan L[7], 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..6] => Imaks = 2, L[imaks] = 55. Tukar L[Imaks] dengan L[6], 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..5] => Imaks = 1, L[imaks] = 44 . Tukar L[Imaks] dengan L[5], 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..4] => Imaks = 4, L[imaks] = 42. Tukar L[Imaks] dengan L[4] (sebenarnya tidak perlu dilakukan, karena 42 sudah berada pada posisi yang tepat), 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..3] => Imaks = 2, L[imaks] = 18 . Tukar L[Imaks] dengan L[3], 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..2] => Imaks = 2, L[imaks] = 12. Tukar L[Imaks] dengan L[2] (sebenarnya tidak perlu dilakukan, karena 12 sudah berada pada posisi yang tepat), diperoleh :

06 12 18 42 44 55 67 94 1 2 3 4 5 6 7 8 Selesai. Larik L sudah terurut menaik !!!


(36)

Untuk mendapatkan larik yang terurut menurun, algoritma pengurutan maksimum dapat ditulis sebagai berikut :

Pass 1 : Cari elemen terbesar di dalam L[1..N]. Tukarkan elemen terbesar dengan elemen L[1]. Pass 2 : Cari elemen terbesar di dalam L[2..N].

Tukarkan elemen terbesar dengan elemen L[2]. Pass 3 : Cari elemen terbesar di dalam L[3..N].

Tukarkan elemen terbesar dengan elemen L[3].

Pass N-1 :Cari elemen terbesar di dalam L[N-1..N]. Tukarkan elemen terbesar dengan elemen L[N-1]. (elemen yang tersisa adalah L[N], 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..8] => Imaks = 1, L[imaks] =94. Tukar L[imaks] dengan L[1] (sebenarnya tidak perlu dilakukan, karena 94 sudah berada pada posisi yang tepat), 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..8] => Imaks = 8, L[imaks] = 67. Tukar L[Imaks] dengan L[2], 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..8] => Imaks = 8, L[imaks] = 55. Tukar L[Imaks] dengan L[3], diperoleh :

94 67 55 42 44 18 06 12 1 2 3 4 5 6 7 8 Procedure urutpilihmaks_ascending(var L:larik;N:integer); Var I : integer; {pencacah untuk jumlah langkah}

J : integer; {pencacah untuk pengapungan pada setiap langkah} U : integer;{indeks ujung kiri bagian larik yang telah terurut} Temp : integer; {peubah bantu pertukaran}

imax : integer; {elemen maksimum} Begin

U:=N;

For I := 1 to n-1 do Begin

iMax :=1; For J := i+1 to N do

If L[J] > L[imax] then imax := J; Begin

Temp := L[U]; L[U] := L[imax]; L[imax] := temp;

U:=U-1;

End; End; End;


(37)

Pass 4 :

(berdasarkan susunan larik hasil pass 3) Cari elemen terbesar di dalam larik [4..8] => Imaks = 5, L[imaks] = 44. Tukar L[Imaks] dengan L[4], 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..8] =>Imaks= 5,L[imaks] = 42. Tukar L[imaks] dengan L[5] (sebenarnya tidak perlu dilakukan, karena 42 sudah berada pada posisi yang tepat), 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..8] =>Imaks= 6,L[imaks] = 18. Tukar L[imaks] dengan L[6] (sebenarnya tidak perlu dilakukan, karena 18 sudah berada pada posisi yang tepat), 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..8] => Imaks = 8, L[imaks] = 12. Tukar L[Imaks] dengan L[7], diperoleh :

94 67 55 44 42 18 12 06 1 2 3 4 5 6 7 8 Selesai. Larik L sudah terurut menurun !!!

6. 3 Insertion Sort ( Pengurutan Sisip)

Untuk mendapatkan larik yang terurut menaik , algoritma pengurutan sisip dapat ditulis secara global sebagai berikut :

Untuk setiap pass ke- i = 2…N lakukan : 1. x L[i]

2. sisipkan x pada tempat yang sesuai antara L[1]…L[i] Procedure urutpilihmaks_descending(var L:larik;N:integer); Var I : integer; {pencacah untuk jumlah langkah}

J : integer; {pencacah untuk pengapungan pada setiap langkah} U : integer;{indeks ujung kiri bagian larik yang telah terurut} Temp : integer; {peubah bantu pertukaran}

imax : integer; {elemen maksimum} Begin

U:=N;

For I := 1 to n-1 do Begin

imax := i; For J := I+1 to N do

If L[J] > L[imax] then imax := J; Begin

Temp := L[i]; L[i] := L[imax]; L[imax] := temp;

U:=U-1;

End; End; End;


(38)

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..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 daripada L[2]. Misalkan posisi yang tepat adalah K. Sisipkan L[2] pada L[K].

Pass 3 : x = L[3] harus dicari tempatnya yang tepat pada 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 daripada L[3]. Misalkan posisi yang tepat adalah K. Sisipkan L[3] pada L[K].

Pass N : x = L[N] harus dicari tempatnya yang tepat pada 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 daripada L[N]. Misalkan posisi yang tepat adalah K. Sisipkan L[3] pada L[K].Hasil dari pass N : Larik L[1..N] sudah terurut, yaitu L[1] <= L[2} <=…<= L[N].

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.

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..2], 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..3], 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..4], diperoleh :

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..5], diperoleh :

12 42 44 55 94 18 06 67


(39)

Pass 6:

(berdasarkan susunan larik pada pass 5) Cari posisi yang tepat untuk x = L[6] pada L[1..6], 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..7], 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..8], diperoleh :

12 18 06 42 44 67 55 94

1 2 3 4 5 6 7 8

Selesai. Larik L sudah terurut menaik !!!

Procedure urutinsert_ascending(var L:larik;N:integer); Var I : integer; {pencacah untuk jumlah langkah} J : integer; {pencacah untuk penelusuran larik}

X : integer; {peubah bantu agar L[K] tidak ditimpa selama pergeseran}

Boolean : boolean; {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];

{cari posisi yang tepat untuk x di dalam L[1..i-1] sambil menggeser} j := i -1;

ketemu := false;

while ( j >= 1) and (not ketemu) do Begin

If x < L[j] then Begin

L[j+1] := L[j]; {geser} J := j – 1;

End Else

Ketemu := true; End;

L[j+1] := x; End; End;


(40)

BAB V

SORTING (PENGURUTAN)

INTERNAL

6. 4 Heap

Heap adalah sebuah binary tree dengan ketentuan sebagai berikut :

ƒ Tree harus complete binary tree

- Semua level tree mempunyai simpul maksimum kecuali pada level terakhir. - Pada level terakhir, node tersusun dari kiri ke kanan tanpa ada yang dilewati.

ƒ Perbandingan nilai suatu node dengan nilai node child-nya mempunyai ketentuan berdasarkan jenis heap, diantaranya :

- Max Heap mempunyai ketentuan bahwa nilai suatu node lebih besar atau sama dengan ( >= ) dari nilai childnya.

- Min Heap mempunyai ketentuan bahwa nilai suatu node lebih kecil atau sama dengan ( <= ) dari nilai childnya.

6.5 Quick Sort

Motivasi metoda ini adalah meletakkan suatu elemen, katakanlah elemen ke 1, pada posisi yang sudah tetap pada deretan. Sewaktu proses ini berlangsung, sekaligus akan dilakukan penyusunan sehingga pada akhirnya semua elemen sebelah kiri mempunyai nilai key <, dan semua elemen sebelah kanan mempunyai ke yang > key elemen ke 1 tersebut.

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. Mulai dari i ke arah kanan cari elemen yang > elemen ke 1, berhasil ditemui ialah elemen ke 4, atau 23. Nilai i sekarang = 4. Mulai dari j ke arah kiri cari elemen yang < elemen ke 1, berhasil ditemui ialah elemen ke 10, atau 12. Nilai j tetap = 10 Tukarkan elemen ke i dan ke j tersebut

.

20 11 5 12 17 9 21 19 4 23 1 2 3 4 5 6 7 8 9 10

i J

Ulangi proses, maka diperoleh I=7 dan j=9 tukarkan.

20 11 5 12 17 9 4 19 21 23 1 2 3 4 5 6 7 8 9 10

i J

Ulangi proses, pencariani i berhasil pada nilai i=9. Sedangkan pencarian j berhenti pada nilai j=8. 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, maka lakukan penukaran elemen ke j dengan elemen ke 1.

19 11 5 12 17 9 4 20 21 23 1 2 3 4 5 6 7 8 9 10


(41)

J I Perhatikan bahwa elemen ke 1 (20) sudah mendapat posisi tetap. Semua elemen sebelah kirinya < 20 dan sebelah kanannya > 20. Perhatikan pula bahwa sekarang deretan nilai “terbelah” menjadi 2 bagian., bagian “kiri” dan bagian “kanan”. Proses selanjutnya ialah mengulang proses semula, mula-mula terhadap deretan kiri (sampai tuntas), kemudian terhadap deretan kanan.

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. Mulai dari i kearah kanan cari elemen yang > elemen ke 1, pencarian gagal, dihentikan dengan nilai i= 7. Mulai dari j ke arah kiri cari elemen yang < elemen ke 1, berhasil ditemui ialah elemen ke 7 atau 4. Nilai j tetap = 7.

19 11 5 12 17 9 4

1 2 3 4 5 6 7 i j Karena I sudah >= j, tukarkan elemen ke j dengan elemen ke 1.

4 11 5 12 17 9 19

1 2 3 4 5 6 7

i j

Perhatikan bahwa 19 sudah mendapat posisi finalnya. Tinggal bagian kiri (mulai dari elemen ke 1 s/d 6) yang akan diproses lebih lanjut. Demikian seterusnya sehingga seluruh bagian kiri akhirnya akan terurut.

Prosesnya berturut turut :

4 11 5 12 17 9

2 3 4 5 6 j i

11 5 12 17 9 2 3 4 5 6 i J 11 5 9 17 12 2 3 4 5 6 j I 11 9 17 12 3 4 5 6 j i

17 12 5 6

I j

4 5 9 11 12 17

1 2 3 4 5 6 Lakukan Proses terhadap deretan kanan

Perhatikan bahwa metoda quicksort ini bersifat rekursif, karena proses pembuatan bagian (partisi) dilakukan kembali terhadap bagian yang terbentuk.

11 17 12 4 5 6 j i

12 17 5 6

Tukar elemen ke j dengan ke i Pencarian j gagal, tidak ada pertukaran.

Tukar elemen ke j dengan ke 1

Tukar elemen ke j dengan ke 1

Pencarian j gagal, tidak ada pertukaran

Selesai .


(42)

6.6 Memilih diantara Metode Sort

Setiap metode sort mempunyai beberapa keuntungan dan kerugian yang akan dipertimbangkan dalam meilih diantara metode sort-metode sort tersebut untuk tugas pemrograman tertentu. Umumnya metode Insertion sort (sisip) mungkin sangat bermanfaat pada saat data yang harus diurutkan sebgai data yang dimasukkan, jika diaplikasikan pada daftar yang sudah ada dalam memori, penambahn memori untuk membuat daftar baru yang diperlukan.

Bubble dan metode seleksi (selection sort) mempunyai keuntungan sederhana dan mudah diterapkan. Bubble sort merupakan metode yang dapat berakhir pada saat daftar yang sudah diurtkan diperoleh, yang mempunyai keuntungan jika data yang diurutkan mempunyai peluang tinggi sudah dalam keadaan urut atau hampir urut ketika pengurutan dikerjakan.

Analisi matematis terhadap heap sort cukup rumit. Hasilnya memperlihatkan bahwa performance terbaik, rata-rata dan terburuk dari algoritma ini = O(n log n) – O(n). Sehingga dapat disimpulkan bahwa metode ini adalah metode yang mempunyai performance cukup baik, bahkan dalam kasus terburuknya.

Quick sort di harapakan mempunyai proses yang terbaik, membuat mmetode ini dipilih untuk jumlah data yang besar, kerugiannya bahwa metode ini menerapkan paling sederhana dalam rekursif dan tidak berakhir secara automatis jika daftar yang diurutkan sudah diperoleh, pada beberapa tingkat lanjutan dalam proses sorting (dalam rekursifnya).


(43)

BAB VI

SEARCHING (PENCARIAN)

7. 1 Pencarian Beruntun (Sequential Search)

Prinsip kerja pencarian beruntun adalah membandingkan setiap elemen larik satu per satu secara beruntun, mulai dari elemen pertama sampai elemen yang dicari ditemukan atau semua elemen sudah diperiksa. Pencarian beruntun ada dua macam yaitu : pencarian beruntun pada larik terurut dan pencarian beruntun pada larik tidak terurut.

7.1.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.

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, elemen yang diperiksa: 44, 55, 12, 42, 94 (ditemukan) Indeks larik yang dikembalikan : idx = 4.

Misalkan nilai yang dicari adalah X = 44 Maka, elemen yang diperiksa: 44 (ditemukan) Indeks larik yang dikembalikan : idx = 1.

Misalkan nilai yang dicari adalah X = 10

Maka, elemen yang diperiksa: 44, 55, 12, 42, 94, 18, 06, 67 (tidak ditemukan) Indeks larik yang dikembalikan : idx = 0.

Algoritma pencarian beruntun sbb :

Procedure cari runtun1(L:larik, n:integer; x:integer; var idxX:integer);

{mencari X di dalam larik L[1..N] secara beruntun, dimulai dari elemen pertama sampai X ditemukan atau seluruh elemen larik L sudah diperiksa. Keluaran dari proses ini adalah indeks idxX dimana L[idxX] :=X. idxX berharga 0 jika X tidak ditemukan}

Var i : integer; {indeks untuk pencarian} Begin

i := 1;

{periksa selama i < n dan L[i] ≠x} while (i < n) and (L[i] <> x) do begin

i := i + 1; {maju ke elemen berikutnya} end;

{i = n atau L[i] = x} {simpulkan hasil pencarian} if (L[i] <> x ) then idxX := 0 else idxX := i; End;


(1)

BAB IX

LINKED LIST

(SENARAI BERANTAI)

1. Pencarian

Langkah-langkah untuk melakuan pencarian data dalam linked list tidak begitu beda dengan langkah-langkah pencarian data pada array. Karena dengan linked list tidak dapat diakses secara acak, maka pencarian yang dilakukan adalah pencarian secara sekuensial.

2. Penelusuran Linked List

Penelusuran berarti menampilkan semua data yang ada di dalam linked list dari posisi awal sampai dengan akhir. Untuk itu diperlukan suatu variable pembantu (sebut saja variable p) yang akan menelusuri data sampai data terakhir.

Langkah-langkah penelusuran adalah :

ƒ Isi variable bantu dengan awal.

ƒ Selama bantu tidak NIL, maka tampilkan info yang ada di elemen yang ditunjuk variable p, kemudian p dipindahkan ke elemen berikutnya.

3. Pengurutan linked list

Langkah pengurutan data dalam linked list sama saja dengan pengurutan data dalam array. Berikut ini adalah implementasi pengurutan data dalam linked list dengan algoritma bubble. Procedure tukar ( var x, y : integer );

Var temp : integer; Begin

temp := x; x := y; y := temp; end;

Procedure Bubble_Sort_Ascending ( var awal , akhir : simpul ); Var p1, p2 : simpul;

Begin

P1 := awal; P2 := p1^. next;

while p1^. next <> nil do begin

while p2 <> nil do begin

if p1^. Info > p2^. Info then tukar (p1^. Info , p2^. Info); p2 := p2^ . next;

end;

p1 := p1^. next; p2 := p1^. next; end;


(2)

A

B

C

D

BAB X

GRAF

Pengertian Graf

Graf didefinisikan sebagai pasangan himpunana verteks atau titik (V) dan edges atau titik (E). Verteks merupakan himpunan berhingga dan tidak kosongdari simpul-simpul (vertices atau node) dan dapat pula ditulis dengan huruf, bilangan asili atau gabungan keduanya {v1, v2,…,vn}. Sedangkan edges merupakan himpunan sisi (edges atau arcs} yang menghubungkan sepasang simpul dan dpat ditulis {e1, e2,..en}.

Notasi graf dapat ditulis G = (V,E).

Derajad suatu simpul v di dalam suatu graf adalah banyaknya simpul yang bertetangga atau terhubung

Notasi : V(G) = himpunan titik graf G. ⏐V⏐ = banyaknya titik pada G E(G) = himpunan sisi graf G. ⏐E⏐ = banyaknya sisi pada G Contoh :V(G) = {A, B, C, D}

E(G) = {(A,B), (B,A), (A,D), (B,D), (B,C), (C,B)} ⏐V⏐ = 4

⏐E⏐ = 6

Deg (A) = 3 Deg (B) = 5 Deg (C) =2 Deg (D) =2

Multiple edge merupakan beberpa edge bisa mempunyai end point yang sama. Contoh : Pada gambar graf berikut ini yang merupakan multiple edge adalah (B,D)

A B

C D

Jenis-Jenis Graf

1. Completee Graph (Graf Lengkap), suatu graf dikatakan graf lengkap jika semua verteks yang ada dihubungkan ke verteks yang lain.

Contoh :

F

C B

D E A

Loop merupakan edge yang mempunyai end point pada verteks yang sama. Pada gambar graf dsamping yang merupakan loop adalah verteks C.


(3)

2. Directed Graph (Graf Berarah), suatu graf dikatakan graf berarah jika garf tersebut mempunyai arah (flow).

Contoh :

Dengan memperhatikan banyaknya jumlah anak panah yang masuk pada satu titik terdapat dua istilah yang lain yaitu :

a. indegree, merupakan banyaknya anak panah yang masuk ke suatu titik.

Contoh : indegree dari contoh graf berarah diats adalah indeg (A) = 0, indeg (B) = 2, indeg (C) = 1, indeg (D) = 1, indeg (E) = 2, indeg (F) = 1.

b. outdegree, merupakan banyaknya anak panah yang meninggalkan ke suatu titik.

Contoh : outdegree dari contoh graf berarah diats adalah outdeg (A) = 2, outdeg (B) = 1, outdeg (C) = 1, outdeg (D) = 2, outdeg (E) = 1, outdeg (F) = 0.

Representasi Graf

Cara merepresentasikan graf antar lain menggunakan :

1 Larik yaitu matrik tetangga (adjency matrix), dimana simpul yang terhubung di dalam matrik pada posisi baris dan kolomnya bernilai 1, jika simpul tidak berhubungna maka di dalam matrik pada posisi baris dan kolomnya bernilai 0.

Contoh 1 :

Pada gambar contoh 1 merupakan graf berbobot dimana setiap edges mempunyai nilai atau bbot. Jika graf tersebut direpresentasikan dalam bentuk matrik, maka yang menjadi baris dan kolomnya adalah jumlah nodenya sehingga menghasilkan matrik n x n. Nilai pada setiap baris dan kolom dari simpul yang berhubungan adalah nilai bobot dari edgesnya. Sedangkan jika simpul tidak berhubungan, maka nilai pada baris dan kolom simpul tersebut di beri nilai 0. Keterhubungan masing-masing simpul dapat bolak balik atau dua arah karena graf tersebut bukan garaf berarah.

Representasi dalam bentuk matrik

1 2 3 4 5 6 7

1 0 30 30 0 0 0 0

2 30 0 0 25 25 0 0

3 30 0 0 30 0 25 0

4 0 25 30 0 0 15 0

5 0 25 0 0 0 0 20

6 0 0 25 15 0 0 20

7 0 0 0 0 20 20 0

F C

B

D E A

5 2

1

3 4

6 7

30 30

30

25

25 25

15

20 20


(4)

Representasi dalam bentuk matrik tetangga

1 2 3 4 5 6 7

1 0 1 1 0 0 0 0

2 1 0 0 1 1 0 0 3 1 0 0 1 0 1 0 4 0 1 1 0 0 1 0 5 0 1 0 0 0 0 1 6 0 0 1 1 0 0 1

7 0 0 0 0 1 1 0

Contoh 2 :

Pada gambar contoh 2 merupakan graf berbobot dimana setiap edges mempunyai nilai atau bbot. Jika graf tersebut direpresentasikan dalam bentuk matrik, maka yang menjadi baris dan kolomnya adalah jumlah nodenya sehingga menghasilkan matrik n x n. Nilai pada setiap baris dan kolom dari simpul yang berhubungan adalah nilai bobot dari edgesnya. Sedangkan jika simpul tidak berhubungan, maka nilai pada baris dan kolom simpul tersebut di beri nilai 0. Keterhubungan masing-masing simpul tidak dapat bolak balik atau dua arah karena graf tersebut merupakan graf berarah yang tergantung dari arah panah setiap edges .

Representasi dalam bentuk matrik

1 2 3 4 5 6 7

1 0 30 10 0 0 0 0

2 0 0 0 0 30 0 0

3 0 0 0 30 0 0 0

4 0 30 0 0 0 15 0

5 0 0 0 0 0 0 20

6 0 0 0 0 0 0 20

7 0 0 0 0 0 0 0 Representasi dalam bentuk matrik tetangga

1 2 3 4 5 6 7 1 0 1 1 0 0 0 0 2 0 0 0 0 1 0 0 3 0 0 0 1 0 0 0 4 0 1 0 0 0 1 0 5 0 0 0 0 0 0 1 6 0 0 1 0 0 0 1 7 0 0 0 0 0 0 0

2. Linked list yaitu medan info berisi nilai bobot dari edgesnya, berikut/next menunjuk ke alamat simpul yang terhubung.

Jika graf contoh 1 diatas direpresentasikan menggunakan linked list, maka keadilustrasinya sebagai berikut :

5 2

1

3 4

6 7

30 10

30

25

30 30

15

20 20


(5)

1 2 30 3 30

2 1 30 4 25

dan seterusnya

X x x 5 25

Aplikasi Graf

1. Pencarian Jalur Terpendek (Shortest path)

Graf digunakan sebagai alat untuk merepresentasikan atau memodelkan suatu persoalan. Berdasarkan graf yang dibentuk barulah persoalan tersebut dapat dianalisis untuk diselesaikan. Salah satu permasalahn yang dapat diselesaikan menggunakan graf adalah mencari lintasan terpendek (Shortest Path). Persoalan dalam mencari lintasan terpendek dalam graf merupakan persoalan optimasi klasik. Graf yang digunakan dalam memecahkan permasalahan lintasan terpendek adalah graf berarah dan berbobot. Contoh bagaimana menyelesaikan sebuah kasus dalam suatu jaringan distribusi barang dari distributor ke agen-agennya. Permasalahan yang timbul adalah bagaimana menemukan lintasan terpendek dari simpul asal ke simpul tujuan untuk mendapatkan solusi yang optimal yaitu menghemat waktu komputasi dan biaya.

Salah satu algoritma yang digunakan dalm shortest path ini adalah algoritma Floyd Warshall dimana algoritma tersebut digunakan untuk menemukan lintasan terpendek dan jarak terpendek semua pasangan simpul dalan suatu graf.

Algoritma Floyd Warshall

Algoritma ini menyelesaikan pencarian lintasa/rute terpendek ketika fungsi bobotnya tidak dibatasi nilai non negatif. Selain itu juga dapat menyelesaikan masalah lintasan terpendek diantara semua pasangan simpul. Algoritma ini mengijinkan bobot sisi negatif. Langkah-langkah dari algoritma Floyd Warshall adalah sebagai berikut :

Misalkan suatu jaringan dengan A = (aij) menjadi matriks bobot n x n dan P= (pij) menjadi matriks posisi simpul dengan orde n x n, dimana n adalah banyaknya simpul.

1. Langkah awal

Inisialisasi matriks A(0) = A dan matriks P(0) = P A(i, i) = 0

A(i, j) = ~, jika tidak ada sisi dari simpul i ke simpul j.

Iterasi tiga diawali dengan dua matriks yaitu A(c – 1) dan P(c-1) dan iterasi terakhir adalah A(c) dan P(c), dimana c = 1, 2,…,n.

2. Elemen-elemen di dalam matriks dinyatakan sebagai berikut :

a. Jika dik(c – 1) ≤ dij(c – 1) + djk(c – 1) maka, isi matriks A (c – 1) dengan (i, k) sama dengan isi matriks A(c) dan isi matriks P(c –1) dengan (i, k) sama dengan isi matriks P(c). Dimana dik merupakan jarak dari simpul i ke simpul k, dij merupakan jarak dari simpul i ke simpul j dan djk merupakan jarak dari simpul j ke simpul k.


(6)

b. Jika dik

(c – 1) ≤ d ij

(c – 1) + djk

(c – 1

) , maka isi (i,k)dalam matriks A(c) adalah jumlah dari isi (i, j) + isi (j, k) dari matriksA(c - 1) dan isi (i, k) dari matriks P(c) adalah sama dengan isis (i, j) dalam matriks P (c - 1).

3. Algoritma ini berhenti jika sudah menemukan simpul tujuan atau c = n sehingga di dapatkan dua matriks yaitu A = A(n) dan P = P (n).