SORTING (BAGIAN II) I. INSERTION SORT 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 (diinsert) diposisi yang seharusnya. Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang. Proses Pertama Proses kedua Proses Ketiga Proses Keempat Proses kelima
Sintaks program fungsi Insertion Sort : Contoh 5.1 ( Program Insertion Sort)
Hasil :
II. QUICK SORT (cara pertama dengan pivot indeks ke-0) Metode Quick sering disebut juga metode partisi (partition exchange sort). Metode ini diperkenalkan pertama kali oleh C.A.R. Hoare pada tahun 1962. Ide dasar dari algoritma Insertion Sort ini adalah mencari tempat yang "tepat" untuk setiap elemen array, dengan cara sequential search. Proses ini kemudian menyisipkan sebuah elemen array yang diproses ke tempatnya yang seharusnya. Langkah-langkah Quick Sort : 1. Pivot: Pivot dapat dipilih dari semua angka yang ada di array. Angka ini bisa yang pertama, angka yang ditengah maupun angka yang terakhir. Dalam contoh program di bawah ini, pivot diambil dari nilai tengah sebuah array. 2. Partition: Pivot digunakan untuk membagi nilai di dalam array menjadi 2 bagian (pembagian yang dilakukan tidak harus seimbang) yaitu left array dan right array. Pembagian dilakukan dengan menggunakan partisi sedemikian hingga dimana pada akhirnya Left array berisi angka yang nilainya lebih kecil dari pivot dan right array memiliki angka yang lebih besar dari angka 3. Cara kerja partisi Pada awal partisi terdapat dua variabel yaitu i dan j. variabel i menunjukkan elemen pertama dari angka (indeks yang pertama dari array), dan variabel j menunjukkan elemen yang terakhir dari angka (indeks terakhir dari array). variabel i digerakkan maju sampai menemukan nilai/angka yang lebih besar dari variabel j pun demikian. Variabel j digerakkan mundur sampai menemukan nilai atau angka yang lebih kecil atau sama dengan Ketika angka-angka ini telah ditemukan, dan nilai i There are two indices i and j and at the beginning of the partition algorithm where i points to the first element and j points to the last one. Then i moves forward until an element with value greater or equal to the pivot is found.
Similarly j moves backward, until an element with value lesser or equal to the pivot is found. Once the elements found and i j then they are swapped. i is incremented to next position (i + 1) and j is decremented to the previous one (j - 1). The partition algorithm stops when i becomes greater than j. 3. Recursion: Once partition is done then recursively sort the new sub-arrays till all the elements are sorted. Example. Sort {1, 12, 5, 26, 7, 14, 3, 7, 2} using quicksort.
Notice, that we show here only the first recursion step, in order not to make example too long. But, in fact, {1, 2, 5, 7, 3} and {14, 7, 26, 12} are sorted then recursively. Jika diketahui n buah data integer (dalam array) Jika n=1, selesai Else, pilih satu elemen sebagai pivot dan partisi data menjadi dua bagian sedemikian hingga elemen-elemen yang lebih besar atau sama dengan pivot berada di bagian sebelah kanan dan elemen-elemen yang lebih kecil berada dibagian sebelah kiri Ulangi Quick Sort secara rekursif terhadap kedua sub bagian tersebut 1. Buku Algoritma dan Pemograman Oleh : Antony Pranata Cara pengambilan pivot didapat dari L = 1 (data 1) dijumlahkan dengan R = N(jumlah data), kemudian dibagi 2. Misal data : 1 2 3 4 5 6 7 16 12 23 50 19 49 31 x data[(l + R) div 2] x data[(1 + 7) div 2] x data[8 div 2] x data[4] Jadi, pivot pada tahap pertama adalah data ke-4 yaitu 50.
2. Buku Algoritma dan Struktur Data dengan C++ Oleh : Indra Yatini B, Erliansyah Nasution. Untuk memilih pivot, kita tidak harus memilih item pertama dalam daftar. Kita bisa memilih setiap item yang kita inginkan dan menukarkannya dengan item pertama sebelum memulai loop yang memisahkan daftar. Sebenarnya, item pertama dalam daftar sering merupakan pilihan buruk untuk dijadikan pivot, karena jika daftar telah terurut, maka tidak ada kunci yang kurang darinya sehingga satu subdaftar akan kosong. Lebih baik memilih pivot dekat dengan tengah daftar, dengan harapan pilihan kita akan memisahkan kunci masing-masing separuh bagian. Menggunakan Referensi 1 Diketahui : Bila terdapat data acak sebagai berikut : 16 12 23 50 19 49 31 Data tersebut akan diselesaikan dengan metode quicksort secara descending. Langkah 1 : Tentukan pivot pada array. Misalkan pivot adalah x. x data[(l+r) div 2] x data[(1 + 7) div 2] x data[8 div 2] x data[4] i L j R i j 1 2 3 4 5 6 7 16 12 23 (50) 19 49 31
i bergerak dari sudut kiri ke kanan sampai mendapatkan nilai yang <= j bergerak dari sudut kanan ke kiri sampai mendapatkan nilai yang >= i berhenti pada data ke-1 krn langsung menemukan nilai yang lebih kecil dari j berhenti pada data ke-4 krn tidak menemukan nilai yang lebih besar daripada Karena i < j maka data yang ditunjuk oleh i ditukar dengan data yang ditunjuk oleh j sehingga menjadi: 50 12 23 16 19 49 31 Langkah 2 : data 1 2 3 4 5 6 7 50 12 23 (16) 19 49 31 i j i berhenti pada data ke-2 karena menemukan nilai yang lebih kecil dari j berhenti pada data ke-7 karena langsung menemukan nilai yang lebih besar dari Karena i < j maka data yang ditunjuk oleh i ditukar dengan data yang ditunjuk oleh j sehingga menjadi: 50 31 23 16 19 49 12
Langkah 3 : Data 1 2 3 4 5 6 7 50 31 23 (16) 19 49 12 i j i berhenti pada data ke-4 karena tidak menemukan nilai yang lebih kecil dari j berhenti pada data ke-6 karena menemukan nilai yang lebih besar dari Karena i < j maka data yang ditunjuk oleh i ditukar dengan data yang ditunjuk oleh j sehingga menjadi: 50 31 23 49 19 16 12 Langkah 4 : Data 1 2 3 4 5 6 7 50 31 23 (49) 19 16 12 i j i berhenti pada data ke-2 karena menemukan nilai yang lebih kecil dari j berhenti pada data ke-4 karena tidak menemukan nilai yang lebih besar dari Karena i < j maka data yang ditunjuk oleh i ditukar dengan data yang ditunjuk oleh j sehingga menjadi: 50 49 23 (31) 19 16 12
Langkah 5 : Data 1 2 3 4 5 6 7 50 49 23 (31) 19 16 12 i j i berhenti pada data ke-3 karena menemukan nilai yang lebih kecil dari j berhenti pada data ke-4 karena tidak menemukan nilai yang lebih besar dari Karena i < j maka data yang ditunjuk oleh i ditukar dengan data yang ditunjuk oleh j sehingga menjadi: 50 49 31 23 19 16 12 Proses pengurutan berhenti karena i tidak menemukan data yang lebih kecil dari x dan j tidak menemukan data yang lebih besar dari x.