Algoritma dan Struktur Data - Merge Sort
-
Upload
kuliahkita -
Category
Engineering
-
view
182 -
download
2
description
Transcript of Algoritma dan Struktur Data - Merge Sort
Merge sort adalah metode pengurutan yang dilakukan dengan memecah penampung elemen tepat menjadi 2 sampai tersisa hanya menjadi 1 partisi, kemudian mengiterasi dengan membandingkan dan menggabungkan secara berulang.
Pendahuluan
Proses - Memecah6 5 3 1 8 7 2 4
6 5 13 78 42
6 5 3 1 8 7 2 4
6 5 3 1 8 7 2 4
Proses - Membandingkan
6 5 13 78 42
Bandingkan satu per satu elemen yang sudah dipecah
Proses - Tukar
5 6 13 78 42
Tukar posisi elemen jika posisi tidak benar.Jika posisi sudah benar, maka lewati dan lanjut ke elemen berikutnya
Proses - Bandingkan Lagi
5 6 13 78 42
Lanjutkan ke dua elemen berikutnya untuk dibandingkan
Proses - Tukar Lagi
5 6 31 78 42
Tukar kembali
Proses - Iterasi Selesai
5 6 1 3 7 8 2 4
5 6 31 87 42
Setelah selesai, gabungkan elemen-elemen yang telah terurut tadi sehingga membentuk tabel-tabel baru seperti di gambar berikut
Proses - Perbandingan Kembali
5 6 1 3 7 8 2 4
Bandingkan:● elemen pertama pada tabel pertama dengan elemen pertama pada tabel kedua dan
sebaliknya secara bergantian● bandingkan elemen terakhir yang belum dimasukkan ke tabel baru (5) dengan
elemen lainya
1 3
Proses - Perbandingan Kembali
5 6 1 3 7 8 2 4
Bandingkan:● Pada tabel kedua sudah habis● bandingkan elemen terakhir yang belum dimasukkan ke tabel baru (5) dengan
elemen lainya (6) yang tersisa
1 3 5 6
Hasil Iterasi
5 6 1 3 7 8 2 4
Tabel yang baru yang siap dibandingkan dengan proses yang sama
1 3 5 6 2 4 7 8
Perbandingan Tabel Baru
Lakukan perbandingan seperti sebelumnya
1 3 5 6 2 4 7 8
1 2 3 4 5 6 7 8
function mergeSort(Input m: list) → list if length(m) ≤ 1 → m var list left, right, result var integer middle = length(m) / 2 for each x in m up to middle begin add x to left end for each x in m after middle begin add x to right end left = mergeSort(left) right = mergeSort(right) result = merge(left, right) → result
function merge(Input: left list,Input right: list) → list list result while (length(left) > 0 or length(right) > 0) do begin if (length(left) > 0 and length(right) > 0) if first(left) ≤ first(right) append first(left) to result left = rest(left) else append first(right) to result right = rest(right) else if length(left) > 0 append first(left) to result left = rest(left) else if length(right) > 0 append first(right) to result right = rest(right) end → result
Pseudocode dengan List
Kode C++template <class M>void myMerge( M arr[], int lb, int mid, int ub ) { int i, j; int size1 = mid - lb + 1; int size2 = ub - mid; M* tmpArray1 = new M[size1]; M* tmpArray2 = new M[size2]; for( i=0; i<size1; i++ ) { tmpArray1[i] = arr[lb + i]; } for( j=0; j<size2; j++ ) { tmpArray2[j] = arr[mid + 1 + j]; } i = 0; j = i; … // lanjut ke slide berikutnya
Kode C++ - lanjutanfor( int k=lb; k<=ub; k++ ) { if (i == size1) { // Kalau range array pertama lebih kecil arr[k] = tmpArray2[j]; j++; } else if (j == size2) { // Kalau range array kedua lebih kecil arr[k] = tmpArray1[i]; i++; } else if ( tmpArray1[i] < tmpArray2[j] ) { arr[k] = tmpArray1[i]; i++; } else { arr[k] = tmpArray2[j]; j++; } } delete[] tmpArray1; // delete[] tmpArray2; // Bersihkan alokasi arraynya}
Kode C++ - lanjutan 2void mergeSort( int arr[], int lb, int ub ) { if (ub - lb > 1) { int mid = (lb + ub) / 2; mergeSort(arr, lb, mid); mergeSort(arr, mid + 1, ub); myMerge(arr, lb, mid, ub); } else { if (arr[ub] < arr[lb]) { int tmp = arr[ub]; arr[ub] = arr[lb]; arr[lb] = tmp; } }}
// ==================== akhir dari prosedur ====================
Kode C++ - lanjutan 3 (main)#include <iostream>
using namespace std;
int main() { int numbers[] = { 8, 40, 1, 5, 0, 9, 6, 4, 3, -1, 5 }; mergeSort(numbers, 0, 10); for (int i=0; i<10; i++) { cout << numbers[i]; cout << “ | “; }}
Kompleksitas
Worst Case O(n log n)
Best Case O(n)
Average Case O(n log n)