Rabu, 16 November 2011

Algoritma Pencarian Bagi Dua


Dalam mencari data, larik dibagi menjadi dua, dan pada larik yang terurut menurun, jika data yang dicari lebih kecil dari data tengah, maka pencarian dilanjutkan ke arah kiri, dan sebaliknya. Data yang disimpan dalam larik harus sudah terurut. Dalam proses pencarian, kita memerlukan 2 buah indeks larik, yaitu indeks terkecil dan terbesar.


Contoh program pascal-nya (untuk menentukan letak angka yang dicari):


program BagiDua;
uses crt;                                                (*untuk mengaktifkan kerja clrscr dan readkey*)

var i,x,j,k,n,idx : integer;            (*var= deklarasi variabel, x=angka yang akan dicari letaknya dalam larik, n=jumlah elemen larik, i= indeks kiri larik, j=indeks kanan larik , idx= posisi angka pada elemen ke berapa, integer=bilangan bulat,  k=indeks elemen tengah *)

    ketemu : boolean;                            (*untuk menentukan apakah x ditemukan*)
 L: array[1..100] of integer;   (*array merupakan deretan suatu variabel yang bertipe data sama*)
begin
write ('berapa jumlah data? '); readln (n);
 i:=1;                                                  (*inisiasi nilai i=1 *)
 for i:=1 to n do
 write ('data ke-',i,' = '); readln (L[i]);
 j:=n;                                                 (*nilai ujung kanan larik = n *)
 ketemu := false;                                (*asumsikan x belum ditemukan*)
 write ('masukkan angka yang dicari: '); readln(x);
while (not ketemu) and (i<=j) do
 begin
 k:= (i+j) div 2;                                 (*bagidua larik A pada posisi k*)
 if (L[k] = x) then
   ketemu := true
 else
  if (L[k] > x) then                            (*lakukan pencarian pada larik bagian kanan*)
    i := k+1                                       (*set indeks ujung kiri larik yang baru*)
  else                                               (*lakukan pencarian pada larik bagian kiri*)
    j := k-1;                                      (*set indeks ujung kanan larik yang baru*)
 end;

 if (ketemu) then                              (* x ditemukan*)
   idx:= k                  
 else                                               (* x tidak ditemukan di dalam larik*)
   idx := -1;
write ('angka ',x,' berada di urutan ke-',idx);
readln;
end.