Algoritma Dan Pen Guru Tan
Algoritma Dan Pen Guru Tan
Sorting
Suryana Setiawan, Ruli Manurung & Ade Azurat
(acknowledgments: Denny)
Fasilkom UI
SUR HMM AA
Outline
Bubble sort Selection sort Insertion sort Shell sort Merge sort Quick sort Ide dasar Contoh eksekusi Algoritma Analisa running time/kompleksitas
Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil Minggu 5
2
SUR HMM AA
Sort
Sorting = pengurutan Sorted = terurut menurut kaidah/aturan tertentu Data pada umumnya disajikan dalam bentuk sorted. Contoh:
Nama di buku telpon Kata-kata dalam kamus File-file di dalam sebuah directory Indeks sebuah buku Data mutasi rekening tabungan CD di toko musik
Busa dalam air akan naik ke atas. Mengapa? Ketika busa naik ke atas, maka air yang di atasnya akan turun memenuhi tempat bekas busa tersebut.
Pada setiap iterasi, bandingkan elemen dengan sebelahnya: yang busa naik, yang air turun!
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
40 40 40 43 43 65 65 65 58 65 42 65 2 2 1 3 3 0 -1 58 65 42 65 4 1 0 -1 3 3 4
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
40
43
65
-1
58
42
2 1
1 2
40 3
3 40
43 0
-1 58 3
3 42
42 4
65
-1 43
58 65
-1
40
42
43 58 65
Perhatikan bahwa pada setiap iterasi, dapat dipastikan satu elemen akan menempati tempat yang benar
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil Minggu 5
6
1 1
2 0
0 -1
-1 2
3 3
3 3
40 4
42 43 58 65
40 42 43 58 65
-1
40 42 43 58 65
-1
40 42 43 58 65
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
Bubble sort
Running time:
Worst case: O(n2) Best case: O(n) kapan? Mengapa? bi-directional bubble sort original bubble sort: hanya bergerak ke satu arah bi-directional bubble sort bergerak dua arah (bolak balik)
Variasi:
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
Kondisi awal:
Ambil yang terbaik (select) dari unsorted list, tambahkan di belakang sorted list. Lakukan terus sampai unsorted list habis.
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
10
42 65 58 65
-1 42 43 58 65
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
11
40 -1 -1
2 2 2
1 1 1
3 3 3
3 3 3
4 4 0
0 0 4
-1 42 43 58 65 40 42 43 58 65 40 42 43 58 65
-1
40 42 43 58 65
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
12
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
13
Fasilkom UI IKI20100/IKI80110P
Running time:
Berdasarkan analisis big-oh, apakah selection sort lebih baik dari bubble sort? Apakah running time yang sebenarnya merefleksikan analisis tersebut?
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
15
Kondisi awal:
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.
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
16
40
43
65
-1 58
42
40
43
65
-1 58
42
40 43
65
-1 58
42
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
17
40 43
65
-1 58
42
40 43 65
-1 58
42
40 43 65
-1 58
42
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
18
40 43 65
-1 58
42
40 43 65 -1 58
42
-1 0
0 1
1 2
2 3
40 43 65 65 58 3 40 43
42
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
19
-1 0
0 1
1 2
2 3
40 43 65 58 65 65 42 3 3 43 43 58 40
-1 0
0 1
1 2
2 3
40 43 65 42 65 58 65 3 3 43 40 43
-1 0
0 1
1 2
2 3
40 43 65 42 65 58 65 65 3 3 43 40 43 43 58 4 42
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
20
public static void insertionSort (int[] a) { for (int ii = 1; ii < a.length; ii++) { int jj = ii;
Ambil elemen pertama dalam unsorted while (( jj > 0) && (a[jj] < a[jj - 1])) { list. int temp = a[jj]; a[jj] = a[jj - 1]; Sisipkan ke a[jj - 1] = temp; dalam sorted jj--; list. }
} }
Perhatikan: ternyata nilai di a[jj] selalu sama kita dapat melakukan efisiensi di sini! AA 2009/2010 Ganjil Minggu 5 SUR HMM Fasilkom UI IKI20100/IKI80110P
21
public static void insertionSort2 (int[] a) { for (int ii = 1; ii < a.length; ii++) { int temp = a[ii]; int jj = ii; while (( jj > 0) && (temp < a[jj - 1])) { a[jj] = a[jj - 1]; jj--; } a[jj] = temp; } }
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
22
Apakah insertion sort lebih cepat dari selection sort? Perhatikan persamaan dan perbedaan antara insertion sort dan selection sort.
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
23
Bubble sort, Selection sort, dan Insertion sort semua memiliki worst case sama: O(N2). Ternyata, untuk algoritma manapun yang pada dasarnya menukar elemen bersebelahan (adjacent items), ini adalah best worst case: (N2) Dengan kata lain, disebut lower bound Bukti: Section 8.3 buku Weiss
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
24
Shell sort
Ide Donald Shell (1959): Tukarlah elemen yang berjarak jauh! Original: 40 2 1 43 3 65 0 -1 58 3 42 4
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
25
Shell sort
Original: 40 2 After 5-sort: 40 0 After 3-sort: 2 0 -1 3 1 4 40 3 42 43 65 58 -1 43 3 42 2 1 58 3 65 4 1 43 3 65 0 -1 58 3 42 4
After 1-sort: -1 0 0 1 1 2 2 3 3 43 40 43 43 58 3 40 43 65 42 65 58 65 65 4 42
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
26
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
27
O(N3/2 ) O(N5/4 )
O(N7/6 )
Ada 3 nested loop, tetapi Shell sort masih lebih baik dari Insertion sort. Mengapa?
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil Minggu 5
28
Menggabungkan (merge) 2 sorted array butuh waktu O(n) Membagi sebuah array jadi 2 hanya butuh waktu O(1)
3 40 43 65
-1
4 42 58
CounterA
CounterB
-1
4 40 42 43 58 65
Counterc
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil Minggu 5
29
Implementasikan method yang me-merge 2 sorted array ke dalam 1 sorted array! Asumsi: a dan b sudah ter-sort, |c| = |a|+|b|
Base case: jika jumlah elemen dalam array yang perlu di-sort adalah 0 atau 1. Recursive case: secara rekursif, sort bagian pertama dan kedua secara terpisah. Penggabungan: Merge 2 bagian yang sudah di-sort menjadi satu.
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
31
40
43
65
-1 58
42
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
32
40
2 2
1 1 2
43
3 3
65 65 65
-1 58 -1 58
42 42
4 4 42
split
40
43
-1 58
merge
40
43 65 -1
58
42
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
33
40
43 65 -1
58
42
40 43 65 -1
42 58
merge
-1
40 42 43 58 62
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
34
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
35
Jika jumlah elemen dalam S = 0 atau 1, return. Pilih sembarang elemen v S sebutlah pivot. Partisi S {v} ke dalam 2 bagian: L = {x S {v} | x v} R = {x S {v} | x v} Kembalikan nilai quickSort(S), diikuti v, diikuti quickSort(S).
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
36
4 3 0
58 2 40 1 65 42
-1 43 3
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
37
2 0 -1 4 1 3 3 40 42 58
65
43
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
38
-1 0 1 2 3 3 4
40
42 43 58 65
-1 0 1 2 3 3 4 40 42 43 58 65
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
39
40 left 4
43
65
-1 58
42
4 right
43
65
-1 58
42 40
40
65
-1 58
42 43
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
40
4 4 4 4
2 2 2 2
1 1 1 1
3 3 3 3
3 3 3 3
65 40 -1 -1
0 0 0 0 left
-1 58 40 42 43 -1 58 65 42 43 40 58 65 42 43 40 58 65 42 43 right
2009/2010 Ganjil Minggu 5
41
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
65 -1 -1 2 2 3
0 0 4
-1 58
42
40 58 65 42 43 43 42 58 65 42 43 42 65
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
43
65
-1 58
42 40
1 left
43
65
-1
58
42 40 right
3 left
65
-1
58 43 42 40 right
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
43
sort (rekursif)
CROSSING!
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
44
Proses partitioning butuh waktu: O(n) Proses merging butuh waktu: O(1) Untuk setiap recursive call, algoritma quicksort butuh waktu: O(n) Pertanyaannya: berapa recursive call dibutuhkan untuk men-sort sebuah array?
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
46
Pivot ideal:
Elemen media Elemen Elemen Elemen Median pertama terakhir di tengah-tengah dari ketiga elemen tsb.
SUR HMM AA
Fasilkom UI IKI20100/IKI80110P
47
Generic sort
Semua algoritma yang telah kita lihat mensort int. Bagaimana jika kita ingin sort String? DataMhs? CD? Apa perlu dibuat method untuk setiap class? Tidak! Agar object bisa di-sort, mereka harus bisa dibandingkan dengan object lainnya (comparable). Solusinya:
Gunakan interface yang mengandung method yang dapat membandingkan dua buah object.
Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil Minggu 5
48
SUR HMM AA
Interface java.lang.comparable
Method compareTo returns: <0: object (this) lebih kecil dari parameter ob 0: object (this) sama dengan parameter ob >0: object (this) lebih besar dari
SUR HMM AA Fasilkom UI IKI20100/IKI80110P 2009/2010 Ganjil Minggu 5
49