11
MODUL II MODUL II ALGORITMA & STRUKTUR DATA IALGORITMA & STRUKTUR DATA IPENGURUTAN DATA (SORTING)PENGURUTAN DATA (SORTING)
Oleh: Prima Rosa Oleh: Prima Rosa
([email protected])([email protected])
Jurusan Teknik Informatika Jurusan Teknik Informatika
Universitas Sanata DharmaUniversitas Sanata Dharma
Semester Gasal 2007/2008Semester Gasal 2007/2008
22
Pengurutan Data (Sorting)Pengurutan Data (Sorting)
• Pengurutan (sorting) adalah proses pengurutan
sekumpulan data dalam suatu urutan tertentu (menaik/ascending atau menurun/descending)
• Sorting dipakai untuk:1. membantu proses pencarian (searching)2. Menyelesaikan masalah-masalah
kompleks seperti penjadwalan (scheduling), pengolahan basis data, riset operasi, dsb
• Metode pengurutan data:• Pengurutan data internal: data sedikit,
tersimpan dalam memori utama• Pengurutan data eksternal: data besar,
disimpan dalam memori tambahan
33
Pengurutan Data (Sorting)Pengurutan Data (Sorting)
• Proses sorting memuat 3 sub proses utama:1. Pemecahan larik data menjadi 2 bagian2. Pengurutan data pada masing-masing
bagian3. Penggabungan hasil pengurutan
masing2 bagian• Azmoodeh (1988:299) mengkategori
metode sorting menjadi 2:1. Easy Split/Hard Join (ES/HJ)2. Hard Split/Easy Join (HS/EJ)
44
Pengurutan Data (Sorting)Pengurutan Data (Sorting)
• Terdapat banyak algoritma pengurutan data
• Efisiensi setiap algoritma bervariasi • Beberapa contoh algoritma
pengurutan data: - Selection Sort (HS/EJ)- Bubble Sort (HS/EJ)- Insertion Sort (ES/HJ)- Quick Sort (HS/EJ)
- dll
55
Selection SortSelection Sort Pendekatan Selection Sort:Pendekatan Selection Sort:
Pilih satu nilai dan letakkan di tempat (indeks) Pilih satu nilai dan letakkan di tempat (indeks) terakhir dalam kumpulan dataterakhir dalam kumpulan data
Ulangi langkah di atas untuk setiap data dalam Ulangi langkah di atas untuk setiap data dalam kumpulan datakumpulan data
Langkah lebih rinci:Langkah lebih rinci: Cari nilai terkecil dalam daftarCari nilai terkecil dalam daftar Tukarkan data tersebut dengan data pada indeks Tukarkan data tersebut dengan data pada indeks
pertama pertama Cari nilai terkecil berikutnya dalam daftarCari nilai terkecil berikutnya dalam daftar Tukarkan data tersebut dengan data pada posisi Tukarkan data tersebut dengan data pada posisi
keduakedua Ulangi sampai seluruh data ditempatkan dengan Ulangi sampai seluruh data ditempatkan dengan
benarbenar
66
Contoh: Urutkan data berikut 61, 39, 32, 21, 2, 37Contoh: Urutkan data berikut 61, 39, 32, 21, 2, 37
Iterasi 1: 61 39 32 21 2 37
Iterasi 2: 2 39 32 21 61 37
Iterasi 3: 2 21 32 39 61 37
Iterasi 4: 2 21 32 39 61 37
Iterasi 5: 2 21 32 37 61 39
Hasil : 2 21 32 37 39 61
77
Method Selection SortMethod Selection Sortpublic void selectionSort(int[] data ) {
int i, indeksMin, jum, temp;jum = data.length;
for (i = 0; i<=jum-1; i++){//tiap iterasi dalam satu loop adalah satu langkahindeksMin = i;
//cari nilai terkecil & simpan posisi dalam indeksMinfor (int j = i+1; j < jum; j++) {
if (data[j] < data[indeksMin]) indeksMin = j;
}//tukarkan data[i] dengan data[indeksMin]temp = data[i];data[i] = data[indeksMin];data[indeksMin] = temp;
}}
88
Demo Selection SortDemo Selection Sortpublic class DemoSelectionSortDemo {
public static void main(String s[]) { DemoSelectionSort ss = new DemoSelectionSort (); ss.start();
}
public void start() { int dataKu[]={61, 25, 86, 11, 90, 5, 9, 50, 65, 27}; int indeks;
// tampilkan data mula-mula System.out.println(“Data mula-mula:"); print(dataKu);
selectionSort(dataKu);
// tampilkan hasil sorting System.out.println(“Data terurut:"); print(dataKu); }
99
Demo Selection SortDemo Selection Sort
>java DemoSelectionSort >java DemoSelectionSort Data mula-mula:Data mula-mula:61 25 86 11 90 5 9 50 65 2761 25 86 11 90 5 9 50 65 27Data terurut:Data terurut:5 9 11 25 27 50 61 65 86 905 9 11 25 27 50 61 65 86 90
public void print( int[] data ) { int i; for (i=0; i<data.length; i++) System.out.print(data[i] + " "); System.out.println(); }
public void selectionSort( int[] data ) { // same as before // .... }
}
1010
Bubble SortBubble Sort Dengan selection sort, kita membuat Dengan selection sort, kita membuat
satu penukaran pada akhir setiap iterasisatu penukaran pada akhir setiap iterasi Bubble sort meningkatkan kinerja Bubble sort meningkatkan kinerja
pengurutan dengan membuat lebih dari pengurutan dengan membuat lebih dari satu penukaran dalam setiap iterasisatu penukaran dalam setiap iterasi
Ide dasar di balik bubble sort adalah Ide dasar di balik bubble sort adalah membuat sepasang perbandingan dan membuat sepasang perbandingan dan menukarkan posisi dari pasangan data menukarkan posisi dari pasangan data tersebut jika mereka belum urut.tersebut jika mereka belum urut.
1111
Bubble SortBubble Sort• Urutkan 35, 17, 32, 61, 2, 37 menggunakan Bubble Sort.
Lgkh 1: 35 17 32 61 2 37swap
Lgkh 2: 17 35 32 61 2 37swap
Lgkh 3: 17 32 35 61 2 37 ok
Lgkh 4: 17 32 35 61 2 37swap
Lgkh 5: 17 32 35 2 61 37swap
Iterasi 1: 17 32 35 2 3761
1212
Bubble SortBubble Sort• Lanjutkan iterasi hingga seluruh data terurut
Iterasi 1: 17 32 35 2 3761
Iterasi 2: 17 32 2 35 3761
Iterasi 3: 17 2 32 35 3761
Iterasi 5: 2 17 32 35 37 61
Iterasi 4: 2 17 32 35 3761
1313
Program Bubble SortProgram Bubble Sort
>java DemoBubbleSort
Data mula-mula:
61 25 86 11 90 5 9 50 65 27
Data terurut:
5 9 11 25 27 50 61 65 86 90
• Sama dengan contoh Selection Sort Main program hampir sama
1414
public class DemoBubbleSort {
public static void main(String s[]) { DemoBubbleSort ss = new DemoBubbleSort (); ss.start();
}
public void start() { int dataKu[] = {61, 25, 86, 11, 90, 5, 9, 50, 65, 27}; int index;
// tampilkan data mula-mula System.out.println(“Data mula-mula:"); print(dataKu);
bubbleSort(dataKu);
// tampilkan data terurut System.out.println(“Data terurut:"); print(dataKu); }
public void print( int[] data ) { int i; for (i=0; i<data.length; i++) System.out.print(data[i] + " "); System.out.println(); }
1515
public void bubbleSort( int array2[] ) { // loop untuk mengontrol jumlah iterasi for ( int iter = 1; iter < array2.length; iter++ ) {
// loop untuk mengontrol jumlah perbandingan for ( int idx = 0; idx < array2.length - 1; idx++ ) {
if ( array2[ idx ] > array2[ idx + 1 ] ) swap( array2, idx, idx + 1 );
} } }
// tukar kedua elemen dalam array public void swap( int array3[], int pertama, int kedua ) { int temp; // variabel temporer
temp = array3[pertama]; array3[pertama] = array3[kedua]; array3[kedua] = temp; }}
1616
Insertion SortInsertion Sort
Insertion sort (pengurutan sisip) adalah Insertion sort (pengurutan sisip) adalah metode pengurutan dengan cara metode pengurutan dengan cara menyisipkan elemen larik pada posisi yang menyisipkan elemen larik pada posisi yang tepat. tepat.
Pencarian posisi yang tepat dilakukan Pencarian posisi yang tepat dilakukan dengan melakukan dengan melakukan pencarian beruntunpencarian beruntun di dalam larik. di dalam larik.
Selama pencarian posisi yang tepat, Selama pencarian posisi yang tepat, dilakukan pergeseran elemen larik.dilakukan pergeseran elemen larik.
1717
Insertion SortInsertion Sort Misalkan elemen larik akan diurut Misalkan elemen larik akan diurut menaikmenaik.. Asumsi :Asumsi : L[0] dianggap sudah pada tempatnyaL[0] dianggap sudah pada tempatnya Langkah 1:Langkah 1:
L[1] harus dicari tempatnya yang tepat pada L[0…1] dengan cara L[1] harus dicari tempatnya yang tepat pada L[0…1] dengan cara menggeser elemen L[0..0] ke kanan bila L[0..0] lebih besar dari menggeser elemen L[0..0] ke kanan bila L[0..0] lebih besar dari L[1]. L[1].
Langkah 2:Langkah 2: L[2] harus dicari tempatnya yang tepat pada L[0..2] dengan cara L[2] harus dicari tempatnya yang tepat pada L[0..2] dengan cara
menggeser elemen L[0..1] ke kanan bila L[0..1] lebih besar menggeser elemen L[0..1] ke kanan bila L[0..1] lebih besar daripada L[2]. Misalkan posisi yang tepat adalah K. Sisipkan L[2] daripada L[2]. Misalkan posisi yang tepat adalah K. Sisipkan L[2] pada L[K].pada L[K].
Langkah 3:Langkah 3: L[3] harus dicari tempatnya yang tepat pada L[0..3] dengan L[3] harus dicari tempatnya yang tepat pada L[0..3] dengan
cara menggeser elemen L[0..2] ke kanan bila L[0..2] lebih besar cara menggeser elemen L[0..2] ke kanan bila L[0..2] lebih besar daripada L[3]. Misalkan posisi yang tepat adalah K. Sisipkan L[3] daripada L[3]. Misalkan posisi yang tepat adalah K. Sisipkan L[3] pada L[K].pada L[K].
……………….. Langkah N-1:Langkah N-1:
L[N-1] harus dicari tempatnya yang tepat pada L[1..N-1] L[N-1] harus dicari tempatnya yang tepat pada L[1..N-1] dengan cara menggeser elemen L[0..N-2] ke kanan bila L[0..N-2] dengan cara menggeser elemen L[0..N-2] ke kanan bila L[0..N-2] lebih besar daripada L[N-1]. Misalkan posisi yang tepat adalah K. lebih besar daripada L[N-1]. Misalkan posisi yang tepat adalah K. Sisipkan L[N-1] pada L[K].Sisipkan L[N-1] pada L[K].
1818
Contoh Insertion SortContoh Insertion Sort
Tinjau larik dengan N=6 buah elemen di bawah ini Tinjau larik dengan N=6 buah elemen di bawah ini yang belum terurut. Larik ini akan diurut menaik:yang belum terurut. Larik ini akan diurut menaik:
29 27 10 8 76 2129 27 10 8 76 21 Iterasi ke 0: Elemen L[0] dianggap sudah terurut.Iterasi ke 0: Elemen L[0] dianggap sudah terurut.
2929 27 10 8 76 21 27 10 8 76 21 Iterasi ke 1: Cari posisi yang tepat untuk L[1] pada Iterasi ke 1: Cari posisi yang tepat untuk L[1] pada
L[0..1] L[0..1]
27 29 27 29 10 8 76 2110 8 76 21 Iterasi ke 2: Cari posisi yang tepat untuk L[2] pada Iterasi ke 2: Cari posisi yang tepat untuk L[2] pada
L[0..2] L[0..2]
10 27 2910 27 29 8 76 21 8 76 21
1919
Contoh Insertion SortContoh Insertion Sort Iterasi ke 3: Cari posisi yang tepat untuk Iterasi ke 3: Cari posisi yang tepat untuk
L[3] pada L[0..3] L[3] pada L[0..3]
88 10 27 2910 27 29 76 21 76 21 Iterasi ke 4: Cari posisi yang tepat untuk Iterasi ke 4: Cari posisi yang tepat untuk
L[4] pada L[0..4] L[4] pada L[0..4]
8 10 27 29 768 10 27 29 76 21 21 Iterasi ke 5: Cari posisi yang tepat untuk Iterasi ke 5: Cari posisi yang tepat untuk
L[5] pada L[0..5] L[5] pada L[0..5]
8 10 21 27 29 768 10 21 27 29 76
Data sudah terurut
2020
Insertion SortInsertion Sortvoid insertionSort(int data[])void insertionSort(int data[]) {{ int temp;int temp; int j;int j; for (int i=1; i<data.length; i++)for (int i=1; i<data.length; i++) {{ temp = data[i];temp = data[i]; j=i-1;j=i-1; while (temp<=data[j] && j>=0)while (temp<=data[j] && j>=0) {{ data[j+1]=data[j];data[j+1]=data[j]; j--;j--; }} data[j+1]= temp;data[j+1]= temp; }} }}
2121
Quick SortQuick Sort
• Quick Sort menggunakan prinsip divide and conquer• Misalkan kita punya data dalam larik S
Algoritma:1. Divide: Jika S memiliki minimal 2 elemen (bagaimana jika S
memiliki 0 atau 1 elemen??), pilih suatu elemen x dalam S, yang kita sebut sebagai pivot. Biasanya, yang dipilih sebagai pivot adalah elemen terakhir dalam S. Pindahkan semua elemen dalam S ke dalam 3 larik berikut
1) L, menyimpan semua elemen dalam S yang < x 2) E, menyimpan semua elemen dalam S yang = x 3) G, menyimpan semua elemen dalam S yang > x
2222
Quick SortQuick Sort
2.2. RecurRecur: Secara rekursif, urutkan larik L dan G : Secara rekursif, urutkan larik L dan G 3.3. ConquerConquer: Kembalikan elemen-elemen ke dalam S : Kembalikan elemen-elemen ke dalam S
secara terurut dengan terlebih dahulu menyisipkan secara terurut dengan terlebih dahulu menyisipkan elemen-elemen dalam L, kemudian E, dan diikuti G elemen-elemen dalam L, kemudian E, dan diikuti G
Contoh:Contoh: Terdapat larik (85, 24, 63, 45, 17, 31, 96, 50). Terdapat larik (85, 24, 63, 45, 17, 31, 96, 50).
Terlalu sulit mengurutkan data tersebut dalam satu Terlalu sulit mengurutkan data tersebut dalam satu langkahlangkah
Pilih 50 sebagai Pilih 50 sebagai pivotpivot dan bagi elemen-elemen ke dan bagi elemen-elemen ke dalam 3 larik: (24, 45, 17, 31), (50), and (85, 63, dalam 3 larik: (24, 45, 17, 31), (50), and (85, 63, 96). Problem disederhanakan menjadi mengurutkan 96). Problem disederhanakan menjadi mengurutkan 3 larik. Karena ukuran larik lebih kecil, diharapkan 3 larik. Karena ukuran larik lebih kecil, diharapkan proses pengurutan menjadi lebih mudah.proses pengurutan menjadi lebih mudah.
2323
Quick SortQuick Sort Sekarang kita ambil larik pertama (24, 45, 17, 31) dan Sekarang kita ambil larik pertama (24, 45, 17, 31) dan
tampak bahwa larik tsb masih terlalu kompleks untuk tampak bahwa larik tsb masih terlalu kompleks untuk diurutkan dalam 1 langkah. Maka kita pilih 31 sebagai diurutkan dalam 1 langkah. Maka kita pilih 31 sebagai pivot dan kita pecah larik ke dalam 3 larik lagi (24, pivot dan kita pecah larik ke dalam 3 larik lagi (24, 17), (31), dan (45). Sekarang 2 larik yaitu (31) dan 17), (31), dan (45). Sekarang 2 larik yaitu (31) dan (45) sangat mudah diurutkan (karena mereka (45) sangat mudah diurutkan (karena mereka masing2 hanya terdiri dari 1 elemen dan sudah urut masing2 hanya terdiri dari 1 elemen dan sudah urut dengan sendirinya) dengan sendirinya)
Larik (24, 17) masih kompleks. Maka kita pilih 17 Larik (24, 17) masih kompleks. Maka kita pilih 17 sebagai pivot dan kita pecah ke dalam 3 larik (), (17), sebagai pivot dan kita pecah ke dalam 3 larik (), (17), dan (24). Sekarang seluruh larik-larik kecil sudah dan (24). Sekarang seluruh larik-larik kecil sudah terurut.terurut.
Kita kumpulkan kembali larik-larik kecil tadi. Hasilnya Kita kumpulkan kembali larik-larik kecil tadi. Hasilnya adalah (17, 24). Kemudian kita kumpulkan larik (17, adalah (17, 24). Kemudian kita kumpulkan larik (17, 24), (31), dan (45) bersama. Hasilnya adalah (17, 24, 24), (31), dan (45) bersama. Hasilnya adalah (17, 24, 31, 45).31, 45).
2424
Quick SortQuick Sort
Dengan cara serupa, larik (85, 63, Dengan cara serupa, larik (85, 63, 96) diurutkan. Hasilnya adalah (63, 96) diurutkan. Hasilnya adalah (63, 85, 96).85, 96).
Selanjutnya kita kumpulkan larik (17, Selanjutnya kita kumpulkan larik (17, 24, 31, 45), (50) dan (63, 85, 96) 24, 31, 45), (50) dan (63, 85, 96) bersama sehingga mendapatkan bersama sehingga mendapatkan larik (17, 24, 31, 45, 50, 63, 85, 96).larik (17, 24, 31, 45, 50, 63, 85, 96).
2525
Quick SortQuick Sort
Gambar berikut menunjukkan bagaimana larik Gambar berikut menunjukkan bagaimana larik dipecah ke dalam larik-larik kecil dan pivotnya dipecah ke dalam larik-larik kecil dan pivotnya
6385 24 45 17 31 5096
638524 45 17 31 96
8524 634517
24 85
2626
Quick SortQuick Sort
Gambar berikut menunjukkan bagaimana Gambar berikut menunjukkan bagaimana larik-larik kecil digabungkan larik-larik kecil digabungkan
63 8524 4517 31 50 96
63 8524 4517 31 96
8524 634517
24 85
pivot 50
pivot 96
pivot 17 pivot 63
pivot 31
2727
Penukaran Elemen dalam Quick Penukaran Elemen dalam Quick SortSort
Problem: Problem: bagaimana cara mengatur elemen dalam larik?bagaimana cara mengatur elemen dalam larik?
Contoh:Contoh:
Gunakan 2 indeks, masing-masing mulai dari kiri Gunakan 2 indeks, masing-masing mulai dari kiri dan kanan. dan kanan.
Cari sepasang elemen di mana yang satu < pivot Cari sepasang elemen di mana yang satu < pivot dan yang lain > pivot. dan yang lain > pivot.
Tukar kedua elemen tersebutTukar kedua elemen tersebut Ulangi proses di atas sampai kedua indeks Ulangi proses di atas sampai kedua indeks
bertemu bertemu
638524 451731 50 96
63
r
24 45 17 31 509685
l
2828
Example:
63
r
24 45 17 31 509685
l
63
r
24 45 17 31 509685
l
63
r
24 45 1731 509685
l
Contoh:
2929
6 3
r
2 4 4 5 1 73 1 5 09 68 5
l
6 3
r
2 4 4 51 73 1 5 09 68 5
l
6 3
r
2 4 4 51 73 1 5 09 68 5
l
6 3
r
2 4 4 51 73 1 5 0 9 68 5
l
3030
Quick SortQuick Sortpublic void QuickSort(int data[]){ QuickSortStep(data,0, data.length-1);}public void QuickSortStep(int data[], int in_first, int in_last){ int i,j; int first, last; int temp; first = in_first; last = in_last;
if (first < last) { //bagian untuk mengatur pengurutan i = first + 1; j = last; while (data[i] <= data[first]) i++; while (data[j] > data[first]) j--;
3131
Quick SortQuick Sort
while (i<j) { temp=data[i]; data[i]= data[j]; data[j]=temp; while (data[i] <= data[first]) i++; while (data[j] > data[first]) j--; } temp=data[first]; data[first]=data[j]; data[j]=temp; QuickSortStep(data,first, j-1); QuickSortStep(data,j+1, last); }}
3232
Java implementation public static void quickSort( Sequence S, Comparator c ) { if( S.size() < 2 ) return; quickSortStep( S, c, 0, S.size() - 1 ); } private static void quickSortStep( Sequence S, Comparager c, int leftBound, int rightBound ) { if( leftBound >= rightBound ) return; Object pivot = S.atRank( rightBound ).element(); int leftIndex = leftBound; int rightIndex = rightBound - 1; while(( leftIndex <= rightIndex ) {
while(( leftIndex <= rightIndex ) && c.isLessThanorEqualTo( S.atRank( leftIndex ).element(), pivot )) leftIndex++;
3333
while((rightIndex >= leftIndex ) && c.isGreaterThanorEqualTo(
S.atRank( rightIndex ).element(), pivot )) rightIndex--; if( leftIndex < rightIndex ) S.swapElements( S.atRank( leftIndex ), S.atRank( rightIndex ));
} S.swapElements( S.atRank( leftIndex ), S.atRank( rightBound )); quickSortStep( S, c, leftBound, leftIndex - 1 ); quickSortStep( S, c, leftBound + 1, rightBound ); }
• Kompleksitas waktu quick sort adalah O(n2)
3434
PERBANDINGAN KINERJAPERBANDINGAN KINERJAALGORITMA SORTINGALGORITMA SORTING
ALGORITMA KOMPLEKSITAS WAKTU
Insertion Sort O(n2)
Bubble Sort O(n2)
Selection Sort O(n2)
Quick Sort O(n log n)
Untuk jumlah data yang sama, mana algoritma yg lebih cepat?
3535
PERBANDINGAN KINERJAPERBANDINGAN KINERJAALGORITMA SORTINGALGORITMA SORTING
Pertanyaan refleksi lanjutan:Pertanyaan refleksi lanjutan:1.1. Apakah ada perbedaan kinerja masing-Apakah ada perbedaan kinerja masing-
masing algoritma jika data ditemukan/tidak masing algoritma jika data ditemukan/tidak ditemukan?ditemukan?
2.2. Apakah ada perbedaan kinerja masing-Apakah ada perbedaan kinerja masing-masing algoritma jika data random, terurut masing algoritma jika data random, terurut turun, dan terurut naik?turun, dan terurut naik?
3.3. Kapan (dalam situasi seperti apa) masing-Kapan (dalam situasi seperti apa) masing-masing algoritma:masing algoritma:
Menampilkan kinerja terbaik?Menampilkan kinerja terbaik? Menampilkan kinerja terburuk?Menampilkan kinerja terburuk?
4.4. Adakah algoritma lain yang kompleksitas Adakah algoritma lain yang kompleksitas waktunya setara dengan Quick Sort?waktunya setara dengan Quick Sort?
3636
REFERENSIREFERENSI
www.uu.edu/dept/math/SeniorPapers/97-98/math/www.uu.edu/dept/math/SeniorPapers/97-98/math/green.ppt green.ppt
www.cise.ufl.edu/~sahni/cop3530/powerpoint/www.cise.ufl.edu/~sahni/cop3530/powerpoint/lec2.ppt lec2.ppt
io.uwinnipeg.ca/~ychen2/AlgorithmNotes/io.uwinnipeg.ca/~ychen2/AlgorithmNotes/class19.ppt class19.ppt
ictlab.tyict.vtc.edu.hk/~aho/TN4439/Lecture4.ppt ictlab.tyict.vtc.edu.hk/~aho/TN4439/Lecture4.ppt Modul praktikum Algoritma & Struktur Data I TI USDModul praktikum Algoritma & Struktur Data I TI USD Prima Rosa. Kinerja Algoritma-Algoritma Prima Rosa. Kinerja Algoritma-Algoritma
Pengurutan Data Internal. Widya Dharma. Pengurutan Data Internal. Widya Dharma. September 1994.September 1994.