Rancangan Algoritma Divi
Rancangan Algoritma Divi
Tugas :
1. Rancanglah algoritma divide and conquer untuk menentukan kandidat yang berpeluang
memperoleh suara paling banyak (mayoritas).
2. Buatlah program komputernya dari algoritma diatas dengan menggunakan bahasa
pemrograman C/C++ atau JAVA.
Jawab :
1. Algoritma
function majority ( int [ ] A, int InL, int inD )
if inD = 1 return A (O)
int major L = majority ( A, inL, inD / 2-1 )
int major D = majority ( A, inD / 2+1, inD )
int count = O
for i = o to inD
o if A (i) = major L
count = count + 1
end if
end for
if count > inD/2 return major L
count = o
for i = o to inD – 1
if A ( i ) = major D
count = count + 1
end if
end for
if count > inD/2 return major D
return – 1
- function main
int Array ( n )
int Index L = O
int Index D = n – 1
int x = majority ( Array, index L, index D )
if x = - 1
print ( nilai terbanyak tidak ditemukan )
else
print ( nilai terbanyak adalah X )
2.
/************************************
* @author Budi Kurniawan Hutasuhut *
* *
***********************************/
public class pemilu {
/**
* @param args
*/
public static void main(String[] args) {
String input;
Scanner scan = new Scanner(System.in);
System.out.println("Hasil suara pemilu : ");
input = scan.nextLine();
//Inisialisasi array char sebanyak input hasil suara
char[] hasil = new char[input.length()];
//Looping memasukkan hasil suara kedalam array
for(int i = 0; i<input.length();i++){
hasil[i] = input.charAt(i);
}
//Cek jumlah suara genap atau tidak
//jika genap lanjut ke proses, jika tidak kembali ke awal
if(input.length() % 2 == 0){
char hasilSuara = kandidat_mayoritas(hasil);
if(hasilSuara == '0'){
System.out.println("Tidak ada kandidat yang
mayoritas");
}
else {
System.out.println("Kandidat mayoritas
adalah : "+ kandidat_mayoritas(hasil));
}
}
else {
System.out.println("Jumlah Suara Harus Genap !");
//Kembali ke awal proses jika jumlah suara tidak
genap
main(null);
}
}
private static char kandidat_mayoritas(char[] suara) {
if (suara.length == 1) return suara[0];
//pengambilan nilai tengah dari jumlah suara
int nilaiTengah = suara.length / 2;
//Inisialisasi pembagian array char untuk bagian kiri dan
kanan
char[] arrayKiri = new char[nilaiTengah];
char[] arrayKanan = new char[(suara.length)-(nilaiTengah)];
//mengisi hasil suara kedalam array kiri
for(int i = 0; i<nilaiTengah;i++){
arrayKiri[i] = suara[i];
}
//mengisi hasil suara ke array kanan
int index = 0;
for(int i=nilaiTengah;i<suara.length;i++){
arrayKanan[index] = suara[i];
index++;
}
//Rekursif untuk menampung elemenKanan dan elemenKiri
char elemenKiri = kandidat_mayoritas(arrayKiri);
char elemenKanan = kandidat_mayoritas(arrayKanan);
//Cek kedua elemen
//jika keduanya sama, maka kandidat itu mayoritas
if(elemenKanan == elemenKiri) return elemenKanan;
//Lakukan penghitungan jika elemen kiri dan kanan tidak
sama
//Kandidat yang lebih besar dari nilaiTengah (setengah dari
total suara) adalah kandidat mayoritas
int jumlahKiri = hitungJumlah(suara,elemenKiri);
int jumlahKanan = hitungJumlah(suara, elemenKanan);
//Cek jumlah suara, apakah melebihi nilai tengah
if(jumlahKiri > nilaiTengah){
return elemenKiri;
}
else if (jumlahKanan > nilaiTengah){
return elemenKanan;
}
else{
return '0'; //tidak ada yang dominan
}
}
private static int hitungJumlah(char[] suara, char elemen) {
// TODO Auto-generated method stub
int jumlah = 0;
//menghitung jumlah elemen dalam hasil suara
for(int i = 0; i < suara.length; i++){
if(suara[i] == elemen){
jumlah++;
}
}
return jumlah;
}
}