My first Magazine pemrograman-kompetitif-dasar | Page 58

5 Divide and Conquer . Masukkan subarray yang masih bersisa ke temp . Hanya salah satu dari kedua while ini yang akan dieksekusi while (aIndex ≤ aRight) do temp[tIndex] ← arr[aIndex] aIndex ← aIndex + 1 tIndex ← tIndex + 1 end while while (bIndex ≤ bRight) do temp[tIndex] ← arr[bIndex] bIndex ← bIndex + 1 tIndex ← tIndex + 1 end while 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: . Salin isi array temp ke arr for i ← 0, size − 1 do 32: arr[aLe f t + i] ← temp[i] 33: end for 34: end procedure 30: 31: . Selesai, kini arr[aLe f t..bRight] telah terurut Analisis Algoritma Merge Sort Misalkan N adalah ukuran dari array . Dengan proses membagi array menjadi dua array sama besar secara terus-menerus, banyak kedalaman rekursif dari merge sort adalah O(log N). Untuk setiap kedalaman, dilakukan divide dan combine. Proses divide dan conquer bekerja dalam O(1). Sedangkan proses combine melakukan operasi sebanyak elemen hasil penggabungan. Total elemen yang diproses di tiap kedalaman adalah O(N). 1 2 3 4 Gambar 5.18: Visualisasi hasil pembagian di masing-masing kedalaman. • • • • Pada kedalaman 1, proses combine bekerja dalam O(2 × N/2). Total N elemen diproses. Pada kedalaman 2, proses combine bekerja dalam O(4 × N/4). Total N elemen diproses. Pada kedalaman 3, proses combine bekerja dalam O(8 × N/8). Total N elemen diproses. ... dan seterusnya Dengan O(log N) menyatakan banyaknya kedalaman dan dibutuhkan operasi sebanyak O(N) pada tiap kedalaman, total kompleksitas dari merge sort adalah O(N log N). Bisa dibandingkan bahwa algoritma pengurutan menggunakan merge sort jauh lebih cepat da- ri algoritma pengurutan O(N 2 ) seperti bubble sort . Karena itu, merge sort mampu mengurutkan array dengan ratusan ribu elemen dalam waktu singkat. Merge sort memiliki sifat stable . Artinya jika ada dua elemen a 1 dan a 2 yang bernilai sama (a 1 = a 2 ) dan pada awalnya a 1 terletak sebelum a 2 , maka setelah diurutkan dijamin a 1 akan tetap 48