Buku Diktat - Sorting
Buku Diktat - Sorting
Buku Diktat - Sorting
Sorting adalah proses menyusun elemen-elemen dengan tata urut tertentu dan proses tersebut
terimplementasi dalam bermacam aplikasi. Contohnya pada perbankan. Aplikasi tersebut mampu
menampilkan daftar account yang aktif. Hampir seluruh pengguna pada sistem akan memilih tampilan
daftar berurutan secara ascending demi kenyamanan dalam penelusuran data.
Yang pada kenyataannya ‘urutan tertentu’ yang umum digunakan adalah secara terurut secara
numerical ataupun secara leksikografi (urutan secara abjad sesuai kamus). Ada 2 jenis sorting:
Ascending (naik) & Descending (turun).
Selection Sort
Mencari elemen yang tepat untuk diletakkan di posisi yang telah diketahui, dan
meletakkannya di posisi tersebut setelah data tersebut ditemukan.
Contoh: Selection Sort, Heapsort, Smoothsort, Strand Sort.
Insertion Sort
Mencari tempat yang tepat untuk suatu elemen data yang telah diketahui ke dalam sub
kumpulan data yang telah terurut, kemudian melakukan penyisipan (insertion) data di
tempat yang tepat tersebut.
Contoh: Insertion Sort, Shell Sort, Tree Sort, Library Sort, Patience Sorting.
Merge Sort
Data dibagi menjadi sub kumpulan – sub kumpulan yang kemudian sub kumpulan tersebut
diurutkan secara terpisah, dan kemudian digabungkan kembali dengan metode merging.
Algoritma ini melakukan metode pengurutan merge sort juga untuk mengurutkan sub
kumpulan data tersebut, atau dengan kata lain, pengurutan dilakukan secara rekursif.
Contoh: Merge Sort.
Non-Comparison Sort
Proses pengurutan data yang dilakukan algoritma ini tidak terdapat pembandingan antar
data, data diurutkan sesuai dengan pigeon hole principle.
1
Metode Sorting
1. Radix Sort
Ide dasar dari metode Radix Sort ini adalah mengkategorikan data-data menjadi sub
kumpulan – sub kumpulan data sesuai dengan nilai radix-nya, mengkonkatenasinya,
kemudian mengkategorikannya kembali berdasar nilai radix lainnya.
Contoh implementasi yang akan dilakukan adalah implementasi pada bilangan bulat
positif menggunakan salah satu algoritma pengurutan radix sort. Contohnya adalah
pengurutan sebuah kumpulan data bilangan bulat dengan jumlah digit maksimal 3.
Kemudian pengkategorian dilakukan kembali, nmaun kali ini berdasar digit kedua atau
digit tengah, dan jangan lupa bahwa urutan pada tiap sub kumpulan data harus sesuai
dengan urutan kemunculan pada kumpulan data.
2
Kemudian langkah ketiga, atau langkah terakhir pada contoh ini adalah pengkategorian
kembali berdasar digit yang terkiri, atau yang paling signifikan.
Yang merupakan hasil akhir dari metode pengurutan ini. Di mana data telah terurut
dengan metode radix sort.
pembagi := 1;
for x:=1 to d do begin
{--- inisialisasi KatRadix ---}
for i:=0 to 9 do
InitQueue (KatRadix[i]);
{--- dikategorikan ---}
for i:=1 to n do
Enqueue (KatRadix [(B[i] div pembagi) mod 10], B[i]);
B[i] := 0;
{--- dikonkat ---}
3
ctr := 0;
for i:=0 to 9 do begin
while (NOT IsQueueEmpty (KatRadix[i])) do begin ctr := ctr
+ 1;
B[ctr]:=DeQueue (KatRadix [i]);
end;
end;
pembagi := pembagi * 10;
end;
end;
2. Bubble Sort
Cara kerja Bubble Sort:
1. Algoritma dimulai dari elemen paling awal.
2. 2 buah elemen pertama dari list data dibandingkan.
3. Jika elemen pertama > elemen kedua, dilakukan pertukaran.
4. Langkah 2 dan 3 dilakukan lagi terhadap elemen kedua dan ketiga, seterusnya sampai ke
ujung elemen.
5. Bila sudah sampai di ujung dilakukan lagi ke awal sampai tidak ada terjadi lagi
pertukaran elemen.
6. Bila tidak ada pertukaran elemen lagi, maka list elemen sudah terurut.
deskripsi
adatukar ← true
I ← 1
While (I<n) and (adatukar) do
j ← 1
Adatukar ← false
While j <= (n-I) do
If x[j] > x[j+1] then
Adatukar ← true
temp ← x[j]
X[j] ← x[j+1]
x[j+1] ← temp
endif
j ← j+1
endwhile
i ← i+1
endwhile
4
sebab itu iterasi hanya dilakukan untuk harga i=0, 1, …, n-2 atau sampai tidak terjadi
penukaran dalam suatu iterasi.
Pada gambar di bawah ini, pengecekan dimulai dari data yang paling akhir, kemudian
dibandingkan dengan data di depannya, jika data di depannya lebih besar maka akan ditukar.
Pada proses kedua, pengecekan dilakukan sampai dengan data ke-2 karena data
pertama pasti sudah paling kecil.
5
Keuntungan lain dari algoritma ini adalah dapat dijalankan dengan cukup cepat dan
efisien untuk mengurutkan list yang urutannya sudah hamper benar. Selain kasus terbaik
tersebut, kompleksitas untuk algoritma ini adalah O(n 2). Karenanya algoritma ini termasuk
sangat tidak efisien untuk dilakukan, apalagi jika pengurutan dilakukan terhadap elemen
yang banyak jumlahnya. Biasanya bubble sort digunakan untuk mengenalkan konsep dari
sorting algoritma pada pendidikan computer karena idenya cukup sederhana.
3. Selection Sort
Metode selection sort merupakan perbaikan dari metode bubble sort dengan mengurangi
jumlah perbandingan. Selection sort merupakan metode pengurutan yang mencari nilai data
terbesar atau terkecil dan kemudian menempatkannya pada posisi yang sebenarnya, dimulai
dari data di posisi 0 hingga data di posisi n-1.
Sedangkan metode insertion sort adalah metode pengurutan yang biasa dipakai oleh
pemain kartu dalam mengurutkan kartunya, yaitu menyisipkan kartu dengan nilai yang lebih
kecil ke posisi sebelum kartu pembandingnya.
Selection sort merupakan kombinasi antara sorting dan searching. Untuk setiap proses,
akan dicari elemen-elemen yang belum diurutkan yang memiliki nilai terkecil atau terbesar
akan dipertukarkan ke posisi yang tepat di dalam array. Misalnya untuk putaran pertama,
akan dicari data dengan nilai terkecil dan data ini akan ditempatkan di indeks terkecil
(data[0]), pada putaran kedua akan dicari data kedua terkecil, dan akan ditempatkan di
indeks kedua (data[1]).
Selama proses, pembandingan dan pengubahan hanya dilakukan pada indeks
pembanding saja, pertukaran data secara fisik terjadi pada akhir proses. Teknik pengurutan
dengan cara pemilihan elemen atau proses kerja dengan memilih elemen data terkecil untuk
kemudian dibandingkan dan ditukarkan dengan elemen pada data awal, dan seterusnya
sampai dengan seluruh elemen sehingga akan menghasilkan pola data yang telah disort.
6
Cara Kerja Algoritma Selection Sort
Bagaimana cara kerja dari algoritma selction sort? Berikut adalah langkah perlangkah
cara kerja dari algoritma yang bekerja pada suatu elemen array.
1. Tetapkan suatu indeks yang akan dijadikan awal dari sorting, biasanya indeks pada awal
array.
2. Jika akan dilakukan sorting secara ascending maka cari elemen yang paling kecil dengan
membandingkan dengan nilai indeks yang dijadikan patokan. Lakukan hal yang
sebaliknya jika akan melakukan sorting secara descending.
3. Jika ada nilai yang memenuhi dari langkah b maka lakukan pertukaran indeks yang
dijadikan patokan.
4. Hasil akhir dari langkah c adalah didapat nilai indeks yang terkecil(jika ascending)
kemudian tukarkan nilai indeks tersebut dengan nilai indeks yang paling ujung dari
elemen yang belum terurut.
5. Lakukan langkah-langkah di atas hingga didapatkan elemen array yang telah terurut.
Kondisi awal:
Unsorted list = data
Sorted list = kosong
Ambil yang terbaik (select) dari unsorted list, tambahkan di belakang sorted list.
Lakukan terus sampai unsorted list habis.
7
Sebuah contoh :
Algortimanya:
void selectionSort(Object array[], int startIdx, int endIdx) {
int min;
for (int i = startIdx; i < endIdx; i++) {
min = i;
for (int j = i + 1; j < endIdx; j++) {
if (((Comparable)array[min]).compareTo(array[j])>0)
{
min = j;
}
}
swap(array[min], array[i]);
}
}
Kamus:
I : integer
Pass : integer
Min : integer
8
Temp : integer
Algoritma:
Pass traversal [1..N-1’
Min Pass
I traversal [Pass+1..N]
If (Ti < Tmin) then
Min j
Temp TPass
TPass Tmin
Tmin Temp
{T[1..Pass] terurut}
Untuk menjalankan class SelectionSort kita membutuhkan sebuah class yang berisi
method main yang berfungsi sebagai titik awal program java berjalan. Berikut kode
programnya.
9
}
Kode program di atas adalah class DemoSelectionSort yang fungsinya sebagai class
utama. Terdapat dua buah method yakni method main dan method tampil yang berfungsi
untuk menampilkan elemen array melalui suatu proses iterasi.
4. Insertion Sort
Prinsip dasar Insertion adalah secara berulang-ulang menyisipkan/memasukkan setiap
elemen ke dalam posisi/tempatnya yang benar. Mirip dengan cara orang mengurutkan
kartu, selembar demi selembar kartu diambil dan disisipkan (insert) ke tempat yang
seharusnya. Pengurutan dimulai dari data ke-2 sampai dengan data terakhir, jika ditemukan
data yang lebih kecil, maka akan ditempatkan (di-insert) di posisi yang seharusnya. Pada
penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang.
Berikut ini penjelasan mengenai bagaimana algoritma insertion sort bekerja dalam
pengurutan kartu
Anggaplah anda ingin mengurutkan satu set kartu dari kartu yang bernilai paling kecil
hingga paling besar.
Seluruh kartu diletakkan pada meja, sebutlah meja ini sebagai meja pertama, disusun
dari kiri ke kanan dan atas ke bawah.
Kemudian terdapat meja lain, meja kedua, di mana kartu yang diurutkan akan
diletakkan.
Ambil kartu pertama yang terletak pada pojok kiri atas meja pertama dan letakkan pada
meja kedua.
Ambil kartu kedua dari meja pertama, bandingkan dengan kartu yang berada pada meja
kedua, kemudian letakkan pada urutan yang sesuai setelah perbandingan.
Proses tersebut akan berlangsung hingga seluruh kartu pada meja pertama telah
diletakkan berurutan pada meja kedua
Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi dua
bagian, yang belum diurutkan (meja pertama) dan yang sudah diurutkan (meja kedua).
Elemen pertama diambil dari bagian array yang belum diurutkan dan kemudian diletakkan
sesuai posisinya pada bagian lain dari array yang telah diurutkan. Langkah ini dilakukan
secara berulang hingga tidak ada lagi elemen yang tersisa pada bagian array yang belum
diurutkan.
Kondisi awal
Unsorted list = data
Sorted list = kosong
10
Ambil sembarang elemen dari unsorted list, sisipkan (insert) pada posisi yang benar
dalam sorted list. Lakukan terus sampai unsorted list habis. Bayangkan anda mengurutkan
kartu.
Sebuah Contoh 1:
11
for (int j = i + 1; j < endIdx; j++) {
if (((Comparable) array[k]).compareTo(array[j])>0) {
k = j;
}
}
swap(array[i],array[k]);
}
}
Sebuah Contoh 2:
5. Quick Sort
Quicksort ditemukan oleh C.A.R Hoare. Seperti pada merge sort, algoritma ini juga
berdasar pada pola divide-and-conquer. Berbeda dengan merge sort, algoritma ini hanya
mengikuti langkah-langkah sebagai berikut:
1. Divide
Memilah rangkaian data menjadi dua sub-rangkaian A[p…q-1] dan A[q+1…r] di
mana setiap elemen A[p…q-1] adalah kurang dari atau sama dengan A[q] dan setiap
elemen pada A[q+1…r] adalah lebih besar atau sama dengan elemen pada A[q].
A[q] disebut sebagai elemen pivot. Perhitungan pada elemen q merupakan salah
satu bagian dari prosedur pemisahan
2. Conquer
Mengurutkan elemen pada sub-rangkaian secara rekursif
Pada algoritma quicksort, langkah “kombinasi” tidak dilakukan karena telah terjadi
pengurutan elemen-elemen pada sub-array.
12
while ( data[J] > x ) do dec( J ) endwhile
If ( I < = J ) then
tukar(data[I],data[j])
inc( I )
Dec( J )
endif
endwhile
If ( L < J ) then quicksort(larikpixel, L, J )
If ( I < R ) then quicksort(larikpixel, I, R )
Sebuah Contoh 1:
Rangkaian data:
Inisialisasi elemen kiri sebagai elemen kedua dan elemen kanan sebagai elemen akhir.
Geser elemen kiri ke arah kanan sampai ditemukan nilai yang lebih besar dari elemen pivot
tersebut. Geser elemen kanan kea rah kiri sampai ditemukan nilai dari elemen yang tidak
lebih besar dari elemen tersebut.
Terlihat bahwa titik kanan dan kiri telah digeser sehingga mendapatkan nilai elemen kanan <
elemen kiri. Dalam hal ini tukarkan elemen pivot dengan elemen kanan.
13
Kemudian urutkan elemen sub-rangkaian pada setiap sisi dari elemen pivot.
Sebuah Contoh 2:
28
15 47
Ambil sebuah pivot, kemudian bagi menjadi 2 bagian yaitu bagian yang kurang dari dan
bagian yang lebih dari pivot. Urutkan masing-masing bagian secara rekursif.
14
o Partition
Kemudian semua elemen tersebut disusun dengan menempatkan X pada posisi j
sedemikian rupa sehingga elemen di sebelah kiri lebih kecil dari X dan elemen di
sebelah kanan lebih besar dari X.
o Rekursif
Kemudian proses diulang untuk bagian kiri dan kanan elemen X dengan cara yang
sama dengan langkah 1 sampai kondisi terurut.
b) Seluruh sub array diurutkan secara rekursif dengan cara memanggil fungsi
quicksort().
Quicksort(A, p, r)
{
If (p < r)
15
{
q = Partition(A, p, r);
Quicksort(A, p, q);
Quicksort(A, q+1, r);
}
}
Terlihat bahwa, seluruh aksi terjadi dalam fungsi partition(). Hasil akhirnya :
berupa dua subarray dan seluruh elemen pada subarray pertama ≤ seluruh elemen pada
subarray kedua. Kembalikan hasil berupa indeks dari elemen pivot yang memisahkan kedua
subarray tersebut.
Partition(A, p, r):
c) Pilih sebuah elemen yang bertindak sebagai pivot
d) Pecah array menjadi dua bagian. A[p…i] dan A[j…r]
Seluruh elemen dalam A[p…i] < = pivot
Seluruh elemen dalam A[j…r] > = pivot
e) Increment i until A[i] >= pivot
f) Decrement j until A[j] <= pivot
g) Jika i < j, maka Swap A[i] dan A[j]
h) Jika tidak, return j
i) Repeat until i >= j
Partition(A, p, r)
x = A[p]; //pivot=elemen posisi pertama
i = p; //inisialisasi
j = r;
repeat
while(A[j] > x)
j--;
while(A[i] < x)
i++;
if (i < j) {
Swap(A, i, j);
j--;
i++;
}
else
return j;
until i >= j
16
Sebuah Contoh 3:
17
PIVOT = 11
i = 2, j = 1
i < j NO SWAP
Return j = 1
Q = Partisi = 1
PIVOT = 35
i = 3, j = 9
i < j SWAP
18
PIVOT = 20
i = 6, j = 5
i < j NO SWAP
Return j = 5
Q = Partisi = 5
3 9
19
3 9 11 12 15 17 20 23 31 35
PIVOT = 23
i = 7, j = 6
i < j NO SWAP
Return j = 6
Q = Partisi = 6
PIVOT = 23
i = 7, j = 7
i < j NO SWAP
Return j = 7
Q = Partisi = 7
20
q=1
q=4
QS(4,4) QS(5,5) QS(7,7) QS(8,8)
6. Heap Sort
Adalah binary tree dengan menggunakan kunci, dimana mempunyai aturan-aturan
sebagai berikut:
o Untuk mengisikan heap dimulai dari level 1 sampai ke level di bawahnya, bila
dalam level yang sama semua kunci heap belum terisi maka tidak boleh mengisi di
bawahnya.
o Heap dalam kondisi terurut apabila left child < parent dan right child > parent.
o Penambahan kunci diletakkan pada posisi terakhir dari level dan di sebelah kanan
child yang terakhir, kemudian diurutkan dengan cara upheap.
o Bila menghapus heap dengan mengambil kunci pada parent di level 1 kemudian
digantikan posisi kunci terakhir, selanjutnya disort kembali metode downheap.
21
Array :
Left_child(i) = 2i
Right_child = 2i+1
Parent = j div 2
Metode Upheap:
Bandingkan kunci terakhir dengan parentnya apabila parent < kunci maka lakukan
pertukaran.
Ulangi langkah 1 dengan membandingkan dengan parent selanjutnya sampai posisi
parent di level 1 selesai dibandingkan.
Metode Downheap:
Bandingkan parent dengan left child dan right child apabila parent < left child atau
right child maka lakukan pertukaran.
Ulangi langkah 1 dengan membandingkan dengan left child dan right child pada
posisi level di bawahnya sampai posisi di level terakhir selesai dibandingkan.
7. Merge Sort
Pola Divide and Conquer
Beberapa algoritma mengimplementasikan konsep rekursi untuk menyelesaikan
permasalahan. Permasalahan utama kemudian dipecah menjadi sub-masalah, kemudian
solusi dari sub-masalah akan membimbing menuju solusi permasalahan utama.
Pada setiap tingkatan rekursi ini, pola tersebut terdiri atas 3 langkah:
3. Divide
Memilah masalah menjadi sub masalah
4. Conquer
Selesaikan sub masalah tersebut secara rekursif. Jika sub-masalah tersebut cukup
ringkas dan sederhana, pendekatan penyelesaian secara langsung akan lebih
efektif.
5. Kombinasi
Mengkombinasikan solusi dari sub-masalah, yang akan membimbing menuju
penyelesaian atas permasalahan utama.
22
1. Divide
Memilah elemen-elemen dari rangkaian data menjadi dua bagian.
2. Conquer
Conquer setiap bagian dengan memanggil prosedur merge sort secara rekursif.
3. Kombinasi
Mengkombinasikan dua bagian tersebut secara rekursif untuk mendapatkan
rangkaian data berurutan.
Proses rekursi berhenti jika mencapai elemen dasar. Hal ini terjadi bilamana bagian
yang akan diurutkan menyisakan tepat satu elemen. Sisa pengurutan satu elemen tersebut
menandakan bahwa bagian tersebut telah terurut sesuai rangkaian.
Sebuah contoh
Rangkaian data:
Mengkombinasikan
Mengkombinasikan
23
Latihan Soal
1. Insertion Sort
24
2. Selection Sort
3. Merge Sort
Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer.
25
class MergeSort {
static void mergeSort(int array[], int startIdx, int endIdx)
{
if(startIdx == _____)
{
return;
}
int length = endIdx-startIdx+1;
int mid = _____;
mergeSort(array, _____, mid);
mergeSort(array, _____, endIdx);
int working[] = new int[length];
for(int i = 0; i < length; i++)
{
working[i] = array[startIdx+i];
}
int m1 = 0;
int m2 = mid-startIdx+1;
for(int i = 0; i < length; i++)
{
if(m2 <= endIdx-startIdx)
{
if(m1 <= mid-startIdx)
{
if(working[m1] > working[m2])
{
array[i+startIdx] = working[m2++];
}
else
{
array[i+startIdx] = _____;
}
}
else
{
array[i+startIdx] = _____;
}
}
else
{
array[_____] = working[m1++];
}
}
}
public static void main(String args[])
{
int numArr[] = new int[args.length];
for (int i = 0; i < args.length; i++)
{
numArr[i] = Integer.parseInt(args[i]);
}
mergeSort(numArr, 0, numArr.length-1);
for (int i = 0; i < numArr.length; i++)
26
{
System.out.println(numArr[i]);
}
}
}
4. Quick Sort
Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer.
class QuickSort {
static void quickSort(int array[], int startIdx, int endIdx)
{
//startIdx adalah index bawah
//endIdx adalah index atas
//dari array yang akan diurutkan
int i=startIdx, j=endIdx, h;
//pilih elemen pertama sebagai pivot
int pivot=array[_____];
//memilih
do
{
while (array[i] _____pivot)
{
i++;
}
while (array[j]> _____)
{
j--;
}
if (i<=j)
{
h=_____;
array[i]= _____;
array[j]= _____;
i++;
j--;
}
}while (i<=j);
//rekursi
if (startIdx<j)
{
quickSort(array, _____, j);
}
if (i<endIdx)
{
quickSort(array, _____, endIdx);
}
}
public static void main(String args[])
{
int numArr[] = new int[args.length];
for (int i = 0; i < args.length; i++)
27
{
numArr[i] = Integer.parseInt(args[i]);
}
quickSort(numArr, 0, numArr.length-1);
for (int i = 0; i < numArr.length; i++)
{
System.out.println(numArr[i]);
}
}
}
28
Daftar Pustaka
DF Alfatwa, ER Syah P, FM Ahsan, “Implementasi Algoritma Radix Sort dalam Berbagai Kasus
Bilangan Dibandingkan Algoritma Pengurutan yang lain”. Bandung. 2005.
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Introduction To Algorithms, McGraw-
Hill. 1990.
Handbook UI, Algoritma - algoritma pengurutan internal
http://ranau.cs.ui.ac.id/sda/archive/1998/handout/handout24.html
Wikipedia, (2007). Wikipedia, the free encyclopedia. http://en.wikipedia.org/wiki/Counting_Sort
Wikipedia, (2007). Wikipedia, the free encyclopedia.
http://en.wikipedia.org/wiki/Sorting_Algorithm
Wikipedia, (2007). Wikipedia, the free encyclopedia. http://en.wikipedia.org/wiki/Radix_Sort
http://202.91.15.14/upload/files/6917_02-Sorting.pdf
http://lecturer.eepis-its.edu/~arna/Modul_ASD/8.5%20Quick-Sort.pdf
http://icomit.wordpress.com/2010/12/21/1jam-mahir-selection-sort-menggunakan-java/
http://poss.ipb.ac.id/files/JENI-Intro2-Bab06-Algoritma%20Sorting.pdf
29