Sorting and Searching

Anda mungkin juga menyukai

Anda di halaman 1dari 16

SEARCHING AND SORTING

Oleh
I GEDE BENDESA SUBAWA
SEMESTER I

JURUSAN ILMU KOMPUTER


PROGRAM PASCASARJANA
UNIVERSITAS PENDIDIKAN GANESHA
2016

1. SORTING
A. Counting Sort
a.1 Definisi
Counting Sort merupakan algoritma pengurutan yang efektif dan
efisien yang melakukan pengurutan dengan ide dasar meletakkan elemen
pada posisi yang benar, di mana penghitungan posisi yang benar dilakukan
dengan menghitung (counting) elemen-elemen dengan nilai lebih kecil
atau sama dengan elemen tersebut. Counting Sort bisa juga disebut
pengurutan dengan pencacahan karena elemen yang akan kita urutkan
akan dicacah terlebih dahulu kemudian diurutkan.
a.2. Ilustrasi
Berikut

terdapat

contoh

kasus

yang

harus

dipecahkan

menggunakan Counting Sort. Terdapat sebuah data dengan 10 elemen


yang masih belum terurut, misalnya: 1, 5, 5, 3, 7, 9, 2, 7, 9, 4. Kemudian
kita akan mengurutkan dengan menggunakan Counting Sort. Berikut
illustrasi penyelesaiaannya.
T. Counter
1
1
1
2
1
3
1
4
5
2
6
0
7
2
8
0
9
2

T.awal
1 1
2 5
3 5
4 3
5 7
6 9
7 2
8 7
9 9
10 4

T.hasil
1 1
2 2
3 3
4 4
5 5
6 5
7 7
8 7
9 9
10 9

Keterangan:
-

Tabel Awal merupakan tabel yang berikan elemen sebelum diurut.


Tabel Counter diinisiasikan sebagai tabel yang akan digunakan untuk
mencacah tabel awal.

Tabel akhir merupakan tabel yang berisikan elemen pada tabel awal
yang telah diurut.

Penjelasan langkah kerja Counting Sort berdasarkan ilustrasi diatas:


a. Elemen Tabel Counter sebelum bekerja diinisiasi 0.
b. Telusuri Tabel Awal mulai dari elemen ke-1 hingga ke -10 sambil
mengupdate tabel counter dengan jumlah kemunculan elemen pada
tabel awal
c. Setelah proses a dan b selesai kemudian telusuri tabel counter untuk
mengisi tabel hasil. Tabel hasil terurut.
a.3 Algoritma
Procedure CountingSort(I/O T: array[1..N] of Integer);
{mengurutkan tabel T dengan menggunakan counting sort dengan
hasil akhir terurut naik}
Asumsi: Nilai N (jumlah elemen) diketahui
Variable
C: array[1..k] of integer;
I, j, k : integer;
Algoritma
For i:=1 to k do
C[i]:= 0; {tabel C diinisiasi 0}
Endfor;
For i:=1 to N do
C[T[i]]:= C[T[i]]+1; {telusuri T sambil mengupdate C}
Endfor;
k:=0;
for i:=1 to k do
if(C[i]<>0) then
for j:=1 to C[i] do
terurut}
k:=k+1;
T[k]:=I;
Endfor
Endif
Endfor

a.4 Analisis mengenai counting sort

{telusuri C untuk mengisi T ->

- Syarat agar pengurutan bias dilakukan adalah mengetahui rentang


datanya
- data yang diurutkan juga harus berupa bilangan bulat (integer)
- semakin besar k (rentang data) semakin banyak penggunaan memori

B. Bubble Sort
b.1 Definisi
Bubble Sort merupakan cara pengurutan yang sederhana. Diberi
nama bubble karena proses pengurutan secara berangsur-angsur berpindah
dari posisinya, entah itu ke kanan ataupun ke kiri sesuai dengan jenis
pengurutannya, ascending atau descending.
b.2 Illustrasi
Contoh illustrasi terhadap larik dengan banyak data 6 elemen
kemudian akan diurutkan menggunakan bubble sort secara ascending.
Elemen tersebut sebagai berikut 50, 30, 20, 40, 70, 60.
Illustrasi bubble sort (elemen dengan warna kuning berate harus ditukar):
Iterasi 1
50
50
50

30
30
30

Iterasi 2
20
60
70
40
50
30
20
40
20
60
40
70
50
20
30
40
20
40
60
70
20
50
30
40

Iterasi 3
20
50
20
30
(selesai)

30
50

40
40
20
20

60
60
60

70
70
70

30
50
40
60
70
60
70

60

70

30

60

70

40

50

Iterasi

Berdasarkan illustrasi diatas dapat diketahui bahwa penelusuran dimulai dari


elemen ke- N kemudian dibandingkan dengan elemen ke- N-1, karena harus
diurutkan secara ascending maka elemen ke- N yang memiliki nilai lebih kecil
atau sama dengan elemen ke- N-1 maka posisi elemen tersebut ditukar.

b.3 Algoritma
Procedure BubbleSort(I/O T: array[1..N] of Integer, I N:
Integer);
{mengurutkan elemen Tabel T sejumlah N secara ascending
menggunakan Bubble sort}
Asumsi : nilai N diketahui
Variable
i: integer;
temp: integer;
swapped: Boolean;
Algoritma
do
swapped:= false;
for i:=N downto 1 do
if T[i]<=T[i-1] then
temp:= T[i];
T[i]:= T[i-1];
T[i-1]:= temp;
swapped:=True;
Endif
Endfor
While swapped;

b.4 Analisis penggunaan Bubble Sort


- dapat dijalankan dengan cukup cepat dan efisien untuk mengurutkan
elemen data yang hampir benar.
- sangat tidak efisien digunakan untuk mengurutkan data yang sudah
terurut terbalik. Misalnya untuk mengurutkan data descending secara ascending.
- tidak disarannkan untuk mengurutkan data berulang dan sangat banyak
karena akan memakan waktu yang sangat lama

C. Bucket Sort
c.1 Definisi
Bucket Sort atau sering disebut dengan Bin Sort adalah algoritma
untuk mengurutkan data dengan cara membagi data menjadi range data atau
bucket. Di mana masing-masing range data tersebut akan diurutkan menggunakan
algoritma pengurutan lainnya.

c.2 Illustrasi
Kita akan mencoba mengurutkan data berikut menggunakan bucket
sort dan counting sort. Data awal : 15, 2, 30, 45, 87, 60, 65, 90, 3, 9.
Pengelompokan dengan bucket, misalnya kita menggunakan 3 bucket
dengan range yang sama sehingga jadi seperti berikut.
9

12

10

3, 2, 4

5, 8, 7

Bucket 1
(Range 1-4)

Bucket2
(Range 5-8)

9, 12, 9,
10

Bucket 3
(Range 9-12)

Selanjutnya kita akan menggunakan counting sort untuk masing-masing


bucket, Caranya sama dengan penjelasan counting sort sebelumnya
sehingga menghasilkan sebagai berikut:
2, 3, 4

5, 7, 8

9, 9, 10,
12

Terakhir kita hanya menggabungkan elemen ketiga bucket menjadi seperti


berikut:
2

10

12

c.3 Algoritma
Procedure BucketSort(I/O T: array[1..N] of integer; Bucket:
array[1..k, 1..n] of integer);
{mengurutkan tabel T[1..N] dimana range nilainya [1..n] dan
bucket yang dibuat [1..k]
Asumsi: Nilai N(jumlah elemen), n(range/rentang nilai), k
(jumlah bucket) diketahui.
Variable
i, j, m : integer;
index : array [1..k] of integer;
bucket: array [1..k, 1..n] of integer;
Algoritma
For i:=1 to k do

For j:=1 to n do
Bucket[i,j]:= 0;
Endfor
Endfor
For i:=1 to k do
index[i] :=0;
endfor

{inisiasi bucket}

{inisisasi index bucket}

for i:=1 to N do
{pengisisan bucket}
if(T[i] mod (n div k) =0 and (T[i]>=(n div k))then
m= (T[i]div(n div k));
else
m= (T[i]div(n div k))+1;
endif
index[m]:=index[m]+1;
bucket[m,index[m]]:=T[j];
endfor
for i:=1 to k do
proses counting sort; {pengurutan menggunakan counting}
endfor;
{penggabungan bucket}
m:=1;
For i:=1 to k do
For j:=1 to index[i] do
T[m] := bucket[I,j];
m:=m+1;
Endfor
Endfor

c.4 Analisis menggunakan Bucket Sort


- Syarat agar pengurutan ini dapat dilakukan adalah diketahuinya rentang nilai
data-datanyadan jumlah bucket yang dibuat.
- masing-masing bucket harus memiliki selisih interval yang sama
-

pemilihan

proses

kompleksitas waktu

pengurutan

masing-masing

bucket

mempengaruhi

2. SEARCHING
A. Breadth First Search
Breadth First Search (BFS) merupakan suatu teknik untuk menemukan
solusi dengan cara melakukan pencarian per level tree dari kiri. Jika solusi tidak
ditemukan level ke-n maka pencarian akan dilanjutkan ke level n+1 mulai dari
node paling kiri juga, begitu seterusnya hingga solusi ditemukan.
Ilustrasi pencarian menggunakan BFS:
1

Langkah kerja BFS:


Misalnya kita akan melakukan pencarian node F dari node A dengan
menggunakan BFS:
A

1. Kita membutuhkan 2 variabel untuk menampung rute dan node yang


dikunjungi, misalnya:
- Next : untuk menyimpan node yang akan dikunjungi
- Last : untuk menyimpan node yang telah dikunjungi
Sehingga kondisi awal Next dan Last masih kosong
Next = Last = 2. Masukkan start poin / root kita ke Next sehingga menjadi
Next = A
Last = -

Kemudian cek apakah A adalah solusi, ternyata A bukan solusi sehingga


kita lanjut melakukan pengecekan ke tetangga A yaitu B, C, D.
3. Masukkan A ke Last (karena sudah pernah dikunjungi) dan masukkan B,
C, D ke Next (yang akan dikunjungi). Sehingga menjadi
Next = B, C, D
Last = A
Kemudian kita cek node B (merupakan antrean pertama pada Next)
ternyata bukan merupakan solusi maka dari itu kita perlu mengcek
tetangga B yaitu E.
4. Jadi kita tambahkan E ke Next dan B ke Last sehingga menjadi:
Next = C, D, E
Last = A, B
Selanjutnya kita cek C (merupakan antrean pertama Next) ternyata bukan
merupakan solusi maka kita perlu mengecek tetangga dari C.
5. Karena C tidak memiliki tetangga maka C tetap dimasukkan ke Last
sehingga menjadi:
Next = D, E
Last = A, B, C
Selanjutnya kita cek D (merupakan antrean pertama Next) ternyata bukan
solusi maka kita perlu mengecek tetangga dari D yaitu F dan G.
6. Jadi kita tambahkan F dan G ke Next dan masukkan D ke Last, sehingga
menjadi
Next = E, F, G
Last = A, B, C, D
Selanjutnya kita cek E (merupakan antrean pertama Next) ternyata bukan
merupakan solusi sehingga kita harus mengecek tetangga dari E.
7. Karena E tidak memiliki tetangga maka kita hanya perlu memasukkan E
ke Last saja sehingga menjadi:
Next = F, G
Last = A, B, C, D, E
Kemudian kita cek F (merupakan antrean pertama Next) ternyata F
merupakan solusi jadi kita masukkan F ke Last dan pencarian selesai
sehingga hasil akhirnya menjadi:
Next = G
Last = A, B, C, D, E, F
Dimana last merupakan jalur pencarian F dari A menggunakan BFS.
B. Depth First Search
Depth First Search (DFS) merupakan suatu teknik pencarian untuk
menemukan solusi dengan cara melakukan penelusuran pada sebuah tree mulai

dari node sebelah kiri di tiap levelnya. Jika tidak ditemukan solusi hingga node
paling dalam maka di lanjutkan pengecekan pada node sebelah kananya. Apabila
solusi tidak terdapat pada node terdalam maka pencarian akan dilakukan pada
level sebelumnya dan begitu seterusnya hingga solusi dapat ditemukan.
Ilustrasi pencarian menngunakan DFS:
1

Langkah kerja DFS:


Misalkan kita akan mencari node G dari node A menggunakan
DFS:

F
H

G
I

1. Kita membutuhkan 2 variabel untuk menampung rute dan node yang


dikunjungi, misalnya:
- Next : untuk menyimpan node yang akan dikunjungi

- Last : untuk menyimpan node yang telah dikunjungi


Sehingga kondisi awal Next dan Last masih kosong
Next = Last = 2. Masukkan start poin / root kita ke Next sehingga menjadi
Next = A
Last = Kemudian cek apakah A adalah solusi, ternyata A bukan solusi sehingga
kita lanjut melakukan pengecekan ke tetangga A yaitu B, C, D.
3. Masukkan A ke Last (node yang sudah kita kunjungi) kemudian ganti A
pada Next menjadi B, C, D (tetangganya) karena penelusuran DFS selalu
dari kiri maka kita akan melakukan pengeckan pada Next mulai dari kiri
(depan). Sehingga kondisi menjadi:
Next = B, C, D
Last = A
Kemudian kita cek B (node pertama di Next) ternyata bkan solusi
sehingga kita perlu mengecek tetangganya yaitu E.
4. Masukkan B ke Last dan ganti B pada Next menjadi E (tetangganya)
sehingga kondisinya menjadi:
Next = E, C, D
Last = A, B
Kemudian cek E (node pertama pada next) ternyata bukan merupakan
solusi maka kita harus mengecek tetangga dari E yaitu F dan G.
5. Masukkan E ke Last dang anti E pada Next menjadi F, G sehingga
kondisinya menjadi:
Next = F, G, C, D
Last = A, B, E
Kemudian kita cek F (node pertama pada Next) ternyata bukan solusi
sehingga kita cek kembali tetangganya yaitu H dan I
6. Masukkan F ke Last dang anti F pada Next dengan H dan I sehingga
kondisinya
Next = H, I, G, C, D
Last = A, B, E, F
Kemudian kita cek H (node pertama pada Next) ternyata bukan solusi
sehingga kita cek tetangga dari H
7. Karena H tidak memiliki tetangga kita hanya menambahkan H ke Last dan
menghapus H pada Next sehingga kondisinya menjadi
Next = I, G, C, D
Last = A, B, E, F, H
Kemudian kita cek I (node pertama pada Next) ternyata bukan solusi jadi
kita harus cek tetangganya

8. Karena I tidak memiliki tetangga maka kita hanya perlu memasukkannya


pada Last dan menghapusnya pada Next sehingga kondisinya menjadi:
Next = G, C, D
Last = A, B, E, F, H, I
Kemudian kita cek G ( node pertama pada next) ternyata merupakan solusi
sehingga kita masukkan G ke Last dan pencarian selesai, maka kondisi
akhirnya menjadi
Next = C, D
Last = A, B, E, F, H, I, G
Dimana Last merupakan urutan rute pencarian node G dari A dengan
menggunakan DFS.
Keunggulan DFS:
a. Jika solusi berada pada node paling kiri pada level yang paling dalam
maka proses pencarian menggunakan DFS akan cepat dilakukan.
b. Meminimalkan penggunaan memori penyimpanan, karena node yang
divonis bukan solusi bisa dihapus.
c. Saat solusi sudah ditemukan, tidak perlu melakukan penelusuran balik
untuk menemukan rutenya.
Kelemahan DFS:
a. Jika sebuah tree memiliki level yang sangat dalam, misalnya tak hingga,
maka tidak ada jaminan solusi akan ditemukan
b. DFS tidak menjamin untuk memberikan solusi yang optimal jika terdapat
lebih dari satu solusi namun berada pada level yang berbeda.

3. Mencari Rute dengan menggunakan algoritma Djikstra


6

1
6

5
1

4
F

Pertanyaan:
Tentukan jarak terpendek dari Node A ke Node B, C, D, E, F
menggunakan metode Djikstra.
Pembahasan:
Algoritma Djikstra merupakan sebuah algoritma yang digunakan untuk
menentukan rute terpendek berbasis perhitungan dari satu node ke node yang
lainnya. Dengan kata lain algoritma ini akan membanding jarak terpendek dari
setiap jalur yang harus dilalui.
1. Jarak Node A ke B
Karena Node A hanya memiliki 1 jalur yaitu A-C maka kita akan melewati
jalur tersebut dengan nilai 6. Kemudian dari node C memiliki 3 jalur
keluar dan salah satunya lansung menuju node B jadi kita menggunakan
jalur C-B dengan nilai 3.
Jadi jarak terpendek dari Node A ke B menggunakan metode djikstra
adalah dengan melalui jalur A-C-B dengan nilai 6+3=9.
2. Jarak Node A ke C
Karena dari Node A hanya terdapat satu jalur lansung ke Node C maka
jalur A-C merupakan jalur terpendeknya dengan nilai 6.
3. Jarak Node A ke D
Node A hanya memiliki satu jalur keluar yaitu jalur A-C dengan nilai 6,
kemudian Node C memiliki 3 jalur keluar yaitu C-B dengan nilai 3, C-F
dengan nilai 5, dan C-E dengan nilai 1. Maka djikstra akan memilih jalur
terpendek yaitu C-E dengan nilai 1. Kemudian Node E memiliki 2 jalur
keluar selain E-C (jalur balik) adalah E-B dengan nilai 6 dan E-F dengan
nilai 4. Maka djikstra akan memilih jalur terpendek yaitu E-F dengan nilai
4. Kemudian F memiliki jalur lansung menuju D jadi djikstra akan
menggunakan jalur F-D dengan nilai 2.
Jadi jarak terpendek dari Node A ke D menggunakan metode Djikstra
adalah melalui jalur A-C-E-F-D dengan nilai 6+1+4+2 = 13.
4. Jarak Node A ke E
Node A hanya memiliki satu jalur keluar yaitu jalur A-C dengan nilai 6,
kemudian Node C memiliki jalur lansung ke node E menggunakan jalur CE dengan nilai 1.

Jadi jarak terpendek dari Node A ke E menggunakan metode djikstra


adalah melalui jalur A-C-E dengan nilai 6+1=7.
5. Jarak Node A ke F
Node A hanya memiliki satu jalur keluar yaitu jalur A-C dengan nilai 6,
kemudian Node C memiliki 3 jalur keluar yaitu C-B dengan nilai 3, C-F
dengan nilai 5, dan C-E dengan nilai 1. Maka djikstra akan memilih jalur
terpendek yaitu C-E dengan nilai 1. Kemudian Node E memiliki jalur
langsung ke Node F dengan jalur E-F dengan nilai 4.
Jadi jarak terpendek dari Node A ke F menggunakan metode djikstra
adalah melalui jalur A-C-E-F dengan nilai 6+1+4 = 11.
4. Rute yang dilalui jika menggunakan:
0

a. BFS
0

1. Pencarian
menggunakan
BFS
dimulai
dari
memasukkan simpul ujung (0) ke dalam antrian.
3

2. Ambil simpul dari awal antrian (simpul 1), lalu cek


apakah simpul merupakan solusi.
3. Jika simpul 1 merupakan solusi, pencarian selesai
dan hasil dikembalikan.
4. Jika simpul 1 bukan solusi, masukkan simpul yang
bertetangga dengan simpul 1 yaitu simpul 4 ke
dalam antrian.
5. Lalu cek apakah simpul 4 merupakan solusi.
6. Jika simpul 4 merupakan solusi, pencarian selesai
dan hasil dikembalikan.
7. Jika simpul 4 bukan solusi, dan tidak ada lagi simpul
yang bertetangga dengan simpul 4, maka masukkan
simpul level selanjutnya yaitu simpul 2 ke dalam
antrian.
8. Cek apakah simpul 2 merupakan solusi.
9. Jika simpul 2 merupakan solusi, pencarian selesai
dan hasil dikembalikan.
10.
Jika simpul 2 bukan solusi, masukkan simpul
yang bertetangga dengan simpul 2 yaitu simpul 5 ke
dalam antrian.
11.
Begitu seterusnya lakukan pengecekan pada
simpul tetangga terlebih dahulu, jika belum
ditemukan solusi maka pengecekan menuju level
selanjutnya.
12.
Pada contoh di atas, rute yang dilalui jika
menggunakan algoritma Breadth First Search yaitu: 0
14258763
b. DFS
0

1. Lakukan pencarian dimulai pada setiap level dari


yang paling kiri (0 1 2).
2. Jika pada level yang paling dalam tidak ditemukan
solusi, maka pencarian dilanjutkan pada level
sebelumnya yaitu simpul 4.
3. Jika simpul 4 bukan solusi, maka pencarian
dilanjutkan pada tetangganya yaitu 5.
4. Jika simpul 5 bukan solusi, maka pencarian
dilanjutkan pada simpul sebelah kanannya yaitu 8.
5. Jika simpul 8 bukan solusi, maka pencarian
dilanjutkan pada simpul sebelah kanan yaitu 7.
6. Jika simpul 7 bukan solusi, maka pencarian
dilanjutkan pada simpul sebelah kanannya yaitu 6
7. Jika simpul 6 bukan solusi maka pencarian
dilanjutkan pada tetangganya yaitu 3
8. Jadi pada contoh di atas, rute yang dilalui jika
menggunakan algoritma Depth First Search yaitu: 0
1 2 4 5 8 7 6 3

Anda mungkin juga menyukai