Sorting (Pengurutan) A. Definisi Pengurutan Pengurutan adalah proses mengatur sekumpulan objek menurut urutan atau susunan tertentu. Urutan Objek tersebut dapat menaik (Ascending) atau menurun (Descending). Halaman 1
Data yang telah diurutkan memiliki banyak Keuntungan antara lain : 1. Mempercepat proses pencarian 2. Dapat dengan mudah ditentukan maksimum dan minimumnya Adanya kebutuhan terhadap proses pengurutan memunculkan bermacammacam metode pengurutan yang bertujuan untuk mendapatkan metode pengurutan yang optimal. Halaman 2
Algoritma pengurutan yang dikenal secara luas antara lain : 1. Maximum/Minimum Sort 2. Insertion Sort (Pengurutan Sisip) 3. Bubble Sort (Pengurutan Gelembung) 4. Heap Sort 5. Shell Sort 6. Quick Sort 7. Merge Sort 8. Radix Sort 9. Tree Sort Halaman 3
Pada Kuliah ini hanya akan dibahas tiga metode pengurutan saja, yaitu : 1. Pengurutan Gelembung (Bubble Sort) 2. Pengurutan Maksimum/Minimum (Maximum/Minimum Sort) 3. Pengurutan Sisip (Insertion Sort) Untuk semua algoritma pengurutan yang akan dibicarakan kemudian menggunakan tipe Array (Larik), yang didefinisikan sebagai berikut : {Deklarasi} Const NMaks = 100 {Jumlah Maksimum elemen Array} Type LarikInt = array[1...nmaks] of integer Halaman 4
B. Pengurutan Gelembung (Bubble Sort) Pengurutan gelembung diinspirasi oleh gelembung sabun yang berada di atas permukaan air. Karena berat jenis sabun lebih ringan daripada berat jenis air, maka gelembung sabun akan selalu terapung di atas pemukaan. Prinsip pengapungan digunakan pada pengurutan gelembung. Elemen Array yang berharga paling kecil diapungkan, artinya diangkat ke atas (atau ke ujung kiri Array) melalui proses pertukaran, jika akan dilakukan pengurutan membesar, jika pengurutan mengecil sebaliknya. Halaman 5
Proses pengapungan ini dilakukan sebanyak N kali langkah. Pada akhir setiap langkah ke- I, Array L[1..N] akan terdiri dari dua bagian, yaitu bagian yang sudah terurut, yaitu L[1..i] dan bagian yang belum terurut, yaitu L[i+1..N]. Setelah langkah terakhir, diperoleh Array L[1..N] yang terurut menaik Halaman 6
Algoritma Pengurutan Gelembung Untuk mendapatkan array yang terurut menaik, Proses yang dilakukan pada setiap langkah adalah sebagai berikut : Langkah 1 : Mulai dari elemen k = N, N-1, 2, bandingkan L[k] dengan L[k-1]. Jika L[k] < L[k-1], pertukarkan L[k] dengan L[k-1]. Pada akhir langkah 1, elemen L[1] berisi harga minimum pertama. Halaman 7
Langkah 2 : Mulai dari elemen k = N, N-1,,3, bandingkan L[k] dengan L[k-1]. Jika L[k] < L[k-1], pertukarkan L[k] dengan L[k-1]. Pada akhir langkah 2, elemen L[2] berisi harga minimum ke dua dan larik L[1..2] terurut Langkah 3 : Mulai dari elemen k = N, N-1,, 4, bandingkan L[k] dengan L[k-1]. Jika L[k] < L[k-1], pertukarkan L[k] dengan L[k-1]. Pada akhir langkah 3, elemen L[3] berisi harga minimum ke dua dan larik L[1..3] terurut... Halaman 8
Langkah N-1 : Mulai dari elemen k = N, bandingkan L[k] dengan L[k-1]. Jika L[k] < L[k-1], pertukarkan L[k] dengan L[k-1]. Contoh : Pada akhir langkah N-1, elemen L[N-1] berisi harga minimum ke N-1 dan larik L[1..N-1] terurut menaik (elemen yang tersisa adalah L[N], tidak perlu diurut karena hanya satu-satunya) Diketahui sebuah Array dengan N = 6 buah elemen yang belum Terurut, Array ini akan diurutkan menaik. Elemen Array tersebut Adalah 25, 27, 10, 8, 76, 21 Halaman 9
Algoritmanya adalah sebagai berikut : Procedure BubleSort(Input/output L : LarikInt, Input N : Integer) { K. Awal : Elemen Array L Telah terdefinisi K. Akhir : Elemen Larik L terurut menaik sedemikian hingga L[1] L[2] L[N] Proses : Mengurutkan elemen array L sehingga terurut menaik dengan metode Urut Gelembung} {Deklarasi} i : integer {Pencacah untuk jumlah langkah} k : integer {Pencacah untuk pengapungan pd tiap Temp : integer langkah} {Peubah bantu untuk pertukaran} Halaman 10
{Deskripsi} For i 1 to N-1 do for k N to i+1 do if L[k] < L[k-1] then {Pertukarkan L[k] dengan L[k-1] } Temp L[k] L[k] L[k-1] L[k-1] Temp endif endfor endfor Halaman 11
Untuk memperoleh sebuah array yang terurut menurun dilakukan langkah sebaliknya. Jika diperhatikan pengurutan dengan metode Buble Sort adalah pengurutan yang tidak efisien untuk Array yang mempunyai ukuran yang besar, karena banyaknya operasi pertukaran yang dilakukan pada setiap langkah. Tetapi metode ini sederhana dan mudah dipahami. Halaman 12
C. Pengurutan Maksimum/Minimum Metode pengurutan ini disebut pengurutan Maksimum/minimum karena didasarkan pada pemilihan elemen maksimum/minimum sebagai basis pengurutan. Gagasannya adalah memilih elemen maksimum/minimum kemudian pertukarkan elemen tersebut dengan elemen terujung Array (Elemen ujung kiri atau ujung kanan). Selanjutnya dengan cara yang sama diulang untuk elemen larik yang tersisa dengan tidak lagi menyertakan elemen Array yang telah terurut. Halaman 13
1. Algoritma Pengurutan Maksimum Misalkan elemen Array akan diurut menaik : Langkah 1 : Tentukan harga maksimum di dalam L[1..N] Pertukarkan harga maksimum dengan L[N] Langkah 2 : Tentukan harga maksimum di dalam L[1..N-1] Pertukarkan harga maksimum dengan L[N-1] Langkah 3 : Tentukan harga maksimum di dalam L[1..N-2] Pertukarkan harga maksimum dengan L[N-2].. Langkah N-1 : Tentukan harga maksimum di dalam L[1..2] Pertukarkan harga maksimum dengan L[2] Halaman 14
Elemen tersisa adalah L[1] tidak perlu diurutkan karena merupakan elemen terakhir. Jadi pada setiap langkah pengurutan terdapat proses mencari harga maksimum dam proses pertukaran dua buah elemen array. Jumlah langkah pengurutan adalah N-1. Contoh Diketahui sebuah Array dengan N = 6 buah elemen yang belum Terurut, Array ini akan diurutkan menaik. Elemen Array tersebut Adalah 25, 27, 10, 8, 76, 21 Halaman 15
Algortimanya adalah sebagai berikut : Procedure Urutmaksimum(Input/output L : LarikInt, Input N : Integer) { K. Awal : Elemen Array L Telah terdefinisi K. Akhir : Elemen Larik L terurut menaik sedemikian hingga L[1] L[2] L[N] Proses : Mengurutkan elemen array L sehingga terurut menaik dengan metode Urut Maksimum} {Deklarasi} i : integer {Pencacah untuk jumlah langkah} j : integer {Pencacah untuk mencari nilai maksimum} Temp : integer {Peubah bantu untuk pertukaran} u : integer {Indeks ujung kanan array yang telah terurut} imaks : integer {Indeks elemen array maksimum sementara} maks : integer {Elemen array maksimum sementara} Halaman 16
{Deskripsi} u N For i 1 to N-1 do Maks L[1] imaks 1 for j 2 to u do if L[j] > Maks then Maks L[j] imaks j endif endfor {Pertukarkan L[u] dengan L[iMaks] } Temp L[u] L[u] L[iMaks] L[imaks] Temp endfor Halaman 17
Untuk terurut menurun adalah kebalikannya, yaitu mempertukarkan elemen yang maksimum dengan elemen array sebelah kiri yang belum terurut. 2. Algoritma Pengurutan Minimum Misalkan elemen Array akan diurut menurun : Langkah 1 : Tentukan harga minumum di dalam L[1..N] Pertukarkan harga minumum dengan L[N] Langkah 2 : Tentukan harga minumum di dalam L[1..N-1] Pertukarkan harga minumum dengan L[N-1] Langkah 3 : Tentukan harga minumum di dalam L[1..N-2] Pertukarkan harga minumum dengan L[N-2] Halaman 18
... Langkah N-1 : Tentukan harga minumum di dalam L[1..2] Pertukarkan harga minumum dengan L[2] Elemen yang tersisa adalah L[1], tidak perlu diurut karena hanya satu-satunya Untuk pengurutan menaik adalah kebalikannya, yaitu mempertukarkan elemen yang minimum dengan elemen yang sebelah kiri pada array yang belum terurut Halaman 19
Algortimanya adalah sebagai berikut : Procedure UrutMinimum(Input/output L : LarikInt, Input N : Integer) {K. Awal : Elemen Array L Telah terdefinisi K. Akhir : Elemen Larik L terurut menurun sedemikian Proses hingga L[1] L[2] L[N] : Mengurutkan elemen array L sehingga terurut menurun dengan metode Urut Minimum} {Deklarasi} i : integer {Pencacah untuk jumlah langkah} j : integer {Pencacah untuk mencari nilai minimum} Temp : integer {Peubah bantu untuk pertukaran} u : integer {Indeks ujung kanan array yang telah terurut} imin : integer {Indeks elemen array minimum sementara} Min : integer {Elemen array minimum sementara} Halaman 20
{Deskripsi} u N For i 1 to N-1 do Min L[1] imin 1 for j 2 to u do if L[j] > Min then Min L[j] imin j endif endfor {Pertukarkan L[u] dengan L[iMin] } Temp L[u] L[u] L[iMin] L[iMin] Temp endfor Halaman 21
D. Pengurutan Sisip (Insertion Sort) Pengurutan sisip adalah metode pengurutan dengan cara menyisipkan elemen array pada posisi yang tepat. Pencarian posisi pada yang tepat dimulai pada elemen kedua, dengan pemisalan bahwa elemen pertama sudah pada tempatnya. Selama pencarian posisi yang tepat dilakukan pergeseran elemen array. Halaman 22
Algoritma Pengurutan Sisip Menaik Andaian Langkah 2 Langkah 3 : L[1] sudah pada tempatnya : L[2] harus dicari tempatnya pada L[1..2] dengan cara menggeser elemen L[1..1] ke kanan bila L[1..1] lebih besar dari L[2]. Misalkan posisi yang tepat adalah k, maka sisipkan L[2] pada L[k] : L[3] harus dicari tempatnya pada L[1..3] dengan cara menggeser elemen L[1..2] ke kanan bila L[1..2] lebih besar dari L[3]. Misalkan posisi yang tepat adalah k, maka sisipkan L[3] pada L[k] Halaman 23
Langkah 4... Langkah N : L[4] harus dicari tempatnya pada L[1..4] dengan cara menggeser elemen L[1..3] ke kanan bila L[1..3] lebih besar dari L[4]. Misalkan posisi yang tepat adalah k, maka sisipkan L[4] pada L[k] : L[N] harus dicari tempatnya pada L[1..N] dengan cara menggeser elemen L[1..N-1] ke kanan bila L[1..N-1] lebih besar dari L[N]. Misalkan posisi yang tepat adalah k, maka sisipkan L[N] pada L[k] Halaman 24
Contoh Diketahui sebuah Array dengan N = 6 buah elemen yang belum Terurut, Array ini akan diurutkan menaik. Elemen Array tersebut Adalah 25, 27, 10, 8, 76, 21 Kelemahan metode pengurutan sisip adalah pada banyaknya operasi pergeseran yang diperlukan dalam mencari posisi yang tepat pada elemen array. Halaman 25
Algortimanya adalah sebagai berikut : Procedure UrutSisip(Input/output L : LarikInt, Input N : Integer) { K. Awal : Elemen Array L Telah terdefinisi K. Akhir : Elemen Larik L terurut menaik sedemikian Proses hingga L[1] L[2] L[N] : Mengurutkan elemen array L sehingga terurut menaik dengan metode Urut Sisip} {Deklarasi} k : integer {Pencacah untuk jumlah langkah} j : integer {Pencacah untuk penelusuran array} Temp : integer {Peubah bantu agar L[k] tidak ditimpa selama pergeseran} Halaman 26
{Deskripsi} {Elemen L[1] dianggap telah terurut} For k 2 to N do Temp L[k] {ambil L[k] agar tidak ditimpa pergeseran} {Cari posisi yang tepat untuk L[k] di dalam L[1..k-1] sambil menggeser} while (Temp L[j]) and (j > 1) do L[j+1] L[j] j j-1 endwhile if Temp L[j] then L[j+1] Temp {Posisi yang tepat untuk L[k] ditemukan} else endif endfor L[j+1] L[j] L[j] Temp Halaman 27