Selamat malam omnivora (hahahahahahaha)
Kembali Posting mengenai Algoritma Divide and Conquer. kali ini saya mencontohkan program Merge Sort n buah data, langsung saja saya jelaskan di bawah ini:
Divide: membagi masalah menjadi beberapa upa-masalah yang memiliki kemiripan dengan masalah semula namun berukuran lebih kecil (idealnya berukuran hampir sama),
Conquer: memecahkan (menyelesaikan) masing-masing upa-masalah (secara rekursif), dan
Combine: menggabungkan solusi masing-masing upa-masalah sehingga membentuk solusi masalah semula.
Algoritmanaya :
procedure MergeSort(input/output A : TabelInt,
input i, j : integer)
{ Mengurutkan tabel A[i..j] dengan algoritma
Merge Sort Masukan: Tabel A dengan n elemen
Keluaran: Tabel A yang terurut
}
Deklarasi:
k : integer
Algoritma:
if i < j then { Ukuran(A)> 1}
k¬(i+j) div 2
MergeSort(A, i, k)
MergeSort(A, k+1, j)
Merge(A, i, k, j)
endif
|
procedure Merge(input/output A : TabelInt, input kiri,
tengah,kanan : integer)
{ Menggabung tabel A[kiri..tengah] dan tabel
A[tengah+1..kanan]
menjadi tabel A[kiri..kanan] yang terurut menaik.
Masukan: A[kiri..tengah] dan tabel A[tengah+1..kanan]
yang sudah terurut menaik.
Keluaran: A[kiri..kanan] yang terurut menaik.
}
Deklarasi
B : TabelInt
i, kidal1, kidal2 : integer
Algoritma:
kidal1¬kiri { A[kiri .. tengah] }
kidal2¬tengah + 1 { A[tengah+1 .. kanan] }
i¬kiri
while (kidal1 £ tengah) and (kidal2 £ kanan) do
if Akidal1 £ Akidal2 then
Bi¬Akidal1
kidal1¬kidal1 + 1
else
Bi¬Akidal2
kidal2¬kidal2 + 1
endif
i¬i + 1
endwhile
{ kidal1 > tengah or kidal2 > kanan }
{ salin sisa A bagian kiri ke B, jika ada }
while (kidal1 £ tengah) do
Bi¬Akidal1
kidal1¬kidal1 + 1
i¬i + 1
endwhile
{ kidal1 > tengah }
{ salin sisa A bagian kanan ke B, jika ada }
while (kidal2 £ kanan) do
Bi¬Akidal2
kidal2¬kidal2 + 1
i¬i + 1
endwhile
{ kidal2 > kanan }
{ salin kembali elemen-elemen tabel B ke A }
for i¬kiri to kanan do
Ai¬Bi
endfor
{ diperoleh tabel A yang terurut membesar }
|
Implementasi ke dalam Bahasa Pemrograman C++
hasil Running
#include <cstdlib>#include <iostream>using namespace std;void Merge(int* A, int kiri,int tengah, int kanan){int B[kiri+kanan];int i,kidal1,kidal2;kidal1=kiri;kidal2=tengah+1;i=kiri;while (kidal1<=tengah && kidal2 <= kanan){if(A[kidal1] <= A[kidal2]){B[i]=A[kidal1];kidal1++;}else{B[i]=A[kidal2];kidal2++;}i++;}while ( kidal1 <= tengah ){B[i] = A[kidal1];kidal1++;i++;}while ( kidal2 <= kanan ){B[i] = A[kidal2];kidal2++;i++;}for (int i=kiri;i<= kanan;i++){A[i]=B[i];}}void MergeSort (int* A, int i, int j){int k;if (i<j){k= ((i+j)/2);MergeSort(A, i, k);MergeSort(A, k+1, j);Merge(A, i, k, j);}}int main(int argc, char *argv[]){int n;int i;int j;cout<<"Merge Sort with Divide and Conquer Algoritm";
cout<<"Banyak data :";cin>>n;i=1;j=n;int A[n];for (int x=1;x<=n;x++){cout<<"masukan data ke-"<<x<<" : ";cin>>A[x];}cout<<"Data sebelum diurutkan "<<endl;
for (int x=1;x<=j;x++){cout<<A[x]<<" ";}cout<<endl;MergeSort(A,i,j);cout<<"Data setelah diurutkan "<<endl;
for (int x=1;x<=j;x++){cout<<A[x]<<" ";}cout<<endl;system("pause");return 0;}
Sekian......
Semoga bermanfaat untuk anda,
Terima kritik dan saran untuk pengembangan
Source Code dapat di download disini
Jangan Lupa Komentarnya :)
EmoticonEmoticon