1. Algoritma Searching

advertisement
Nama
Kelas
Fakultas
Tugas
:
:
:
:
Suseno Rudiansyah
X2T
Teknik Informatika
Algoritma 2
1. Algoritma Searching
Pengertian Algoritma Searching
Searching merupakan proses dasar dalam pengolahan data. Yaitu untuk menemukan nilai
tertentu dalam sekumpulan data yang bertipe sama. Algoritma searching dijelaskan secara luas
sebagai algoritma yang menerima masukan berupa sebuah masalah dan menghasilkan sebuah
solusi untuk masalah tersebut. Algoritma searching menerima sebuah argument kunci dan
dengan langkah-langkah tertentu akan mencari rekaman dengan kunci tersebut. Setelah
melakukan proses pencarian, akan diperoleh salah satu dari dua kemungkinan, yaitu data yang
dicari ditemukan atau tidak ditemukan.
Macam-macam Algoritma Searching
1. Pencarian Beruntun (Sequential Search)
Konsep
- Membandingkan setiap elemen larik satu per satu secara urut (beruntun), mulai dari
elemen pertama sampai dengan elemen yang terakhir sampai data ditemukan atau
tidak ditemukan.
- Proses pencarian akan dihentikan jika data yang dicari sudah ditemukan.
- Merupakan metode yang paling sederhana
- Kelemahan pada kasus ini adalah, untuk N elemen data harus dilakukan pencarian
sebanyak N kali pula.
Algoritma
Algoritma pencarian beruntun dapat dituliskan sebagai berikut:
(1) i ← 0
(2) ketemu ← false
(3) selama (tidak ketemu) dan (i <= N) kerjakan baris 4
(4) jika (Data*i+ = x) maka ketemu ← true, jika tidak i ← i + 1
(5) jika (ketemu) maka i adalah indeks dari data yang dicari, jika data tidak ditemukan.
Contoh
#include <stdio.h>
#include <conio.h>
void main()
{
int data[8] = {8,10,6,-2,11,7,1,100};
int cari;
int flag=0;
printf(“masukkan data yang ingin dicari = “);scanf(“%d”,&cari);
for(int i=0;i<8;i++)
{
if(data[i] == cari) flag=1;
}
if(flag==1) printf(“Data ada!\n”);
else printf(“Data tidak ada!\n”);
getch();
return 1;
}
Dari program di atas, terlihat bahwa dilakukan perulangan untuk mengakses semua elemen
array data satu per satu berdasarkan indeksnya.
a. Program menggunakan sebuah variable flag yang berguna untuk menandai ada atau
tidaknya data yang dicari dalam array data. Hanya bernilai 1 atau 0.
b. Flag pertama kali diinisialisasi dengan nilai 0.
c. Jika ditemukan, maka flag akan diset menjadi 1, jika tidak ada maka flag akan tetap
bernilai 0.
d. Semua elemen array data akan dibandingkan satu per satu dengan data yang dicari dan
diinputkan oleh user.
2. Pencarian Beruntun dengan sentinel
Konsep
- Pencarian bertujuan untuk menambahkan elemen baru setelah elemen terakhir
larik, maka terdapat sebuah varian dari metode pencarian berurutan. NIlai x yang
akan dicari sengaja ditambahkan terlebih dahulu. Data yang ditambahkan setelah
elemen larik ini disebut dengan sentinel.
- Perhatikan array berikut ini:
0
3
1
12
ffea
2
9
ffeb
3
-4
ffec
ffed
4
21
ffef
5
6
indeks
fffa
fffb
alamat
6
- Terdapat enam buah data dalam array (dari indeks 0 s.d. lima dan terdapat 1 indeks array
tambahan (indeks ke 6) yang belum berisi data (disebut sentinel)
- Array pada indeks ke-6 berguna untuk menjaga agar indeks data berada pada indeks 0
s.d. 5 saja. Nila pencarian data sudah mencapai array indeks yang ke-6 maka berarti data
TIDAK ADA, sedangkan jika pencarian tidak mencapai indeks ke-6, maka data ADA.
Algoritma
Procedure SeqSearchWithSentinel(input L: LarikInt, input n: integer, input x: integer,
output idx: integer)
DEKLARASI
I: integer
ALGORITMA
L[n+1] ← X {sentinel}
I←1
While (L*i+ ≠ x) do
I ← i+1
Endwhile
If idx = n+1 then
idx ← -1
else
idx ← 1
endif
Contoh
#include <stdio.h>
#include <conio.h>
void main(){
int data[7] = {3,12,9,-4,21,6};
int cari,i;
printf(“masukkan data yang ingin dicari = “);scanf(“%d”,&cari);
data[6] = cari;
i=0;
while(data[i] != cari) i++;
if(i<6) printf(“Data ada!\n”); else printf(“Data tidak ada!\n”);
getch;
return 1;
}
3. Pencarian Bagi Dua (Binary Search)
Konsep
- Merupakan metode pencarian pada data terurut yang paling efisien.
- Metode ini digunakan untuk kebutuhan pencarian dengan waktu yang cepat.
- Prinsip pencarian dengan membagi data atas dua bagian mengilhami metode ini. data
yang disimpan didalam larik harus sudah terurut.
-
Algoritma
Algoritma pencarian biner dapat dituliskan sebagai berikut:
L←0
R←N–1
Ketemu ← false
Selama (L <= R) dan (tidak ketemu) kerjakan baris 5 sampai dengan 8
m ← (L + R) / 283
jika (Data*m+) maka ketemu ← true
jika (x < Data*m+) maka R ← m – 1
jika (x > Data*m+) maka L ← m + 1
jika (ketemu) maka m adalah indeks dari data yang dicari, jika tidak maka data tidak
ditemukan.
Contoh
int binary_search(int cari)
{
int l,r,m;
l = 0;
r = n-1;
int ktm = 0;
while(l<=r && ktm==0)
{
m = (l+r)/2;
if(data[m] == cari) ktm=1;
else if (cari < data[m]) r=m-1;
else l=m+1;
{
if(ktm==1) return 1; else return 0;
}
}
}
2.
Algoritma Searching Sequence Dengan Sentinel
kali ini saya ingin berbagi dengan anda sebuah coding menggunakan bahasa pemrograman C++
tentang algoritma searching sequence dengan sentinel.
algoritma searching sequence ini merupakan tugas mata kuliah saya waktu kuliah. hehe :D
untuk meringan beban anda atau pun untuk menjadikan referensi anda mengenai algoritma
searching sequence.
monggo silahkan disimak :)
berikut codingnya :
#include <stdio.h>
#include <conio.h>
main ()
{
int i, n, dt;
int Posisi, Ketemu;
int Arr[6];
//Aplikasi di mulai
printf(“Inputkan banyaknya data : “);
scanf (“%i”, &n);
//input Array
for (i=0; i<n; i++) {
printf(“masukan data ke %i : “, i + 1);
scanf(“%i”, &Arr*i+);
}
//proses pencarian
printf(“\nMasukan data yang dicari : “);
scanf(“%i”, &dt);
Ketemu =0;
i = 0;
while (Ketemu == 0 && i< n) {
if (Arr[i] == dt) {
Ketemu = 1;
Posisi = i;
} else {
i = i + 1;
}
}
if (Ketemu ==0) {
printf(“data tidak di temukan…\n”);
} else {
printf(“data di temukan pada posisi %i \n”, Posisi + 1);
}
getch();
}
Hasil :
3. Algoritma Binary Searching
Pengertian
Terdapat metode pencarian pada data terurut yang paling efficient, yaitu metode pencarian
bagidua atau pencarian biner (binary search). Metode ini digunakan untuk kebutuhan pencarian
dengan waktu yang cepat. Prinsip pencarian dengan membagi data atas dua bagian mengilhami
metode ini. Data yang disimpan di dalam larik harus sudah terurut.
BST adalah binary tree yang mana data di dalamnya tersusun sedemikian rupa sehingga
pada setiap subtree di dalamnya berlaku: setiap data di subtree kiri < data root subtree < setiap
data di subtree kanan.
Algoritma
class BinaryNode {
void printInOrder( )‫‏‬
{
if( left != null )‫‏‬
left.printInOrder( );
System.out.println( element );
if( right != null )‫‏‬
right.printInOrder( );
}
}
class BinaryTree {
public void printInOrder( )‫‏‬
{
if( root != null )‫‏‬
root.printInOrder( );
}
}
// Left
// Node
// Right
Prinsip dari pencarian biner dapat dijelaskan sebagai berikut :
1. Mula-mula diambil posisi awal 0 dan posisi akhir = N - 1, kemudian dicari posisi data
tengah dengan rumus (posisi awal + posisi akhir) / 2.
2. Kemudian data yang dicari dibandingkan dengan data tengah.
3. Jika lebih kecil, proses dilakukan kembali tetapi posisi akhir dianggap sama dengan
posisi tengah –1.
4. Jika lebih besar, porses dilakukan kembali tetapi posisi awal dianggap sama dengan
posisi tengah + 1.
5. Demikian seterusnya sampai data tengah sama dengan yang dicari.
Algoritma pencarian biner dapat dituliskan sebagai berikut :
Contoh
1.
2.
3.
4.
5.
6.
7.
L ←0
R←N–1
ketemu ← false
Selama (L <= R) dan (tidak ketemu) kerjakan baris 5 sampai dengan 8
m ← (L + R) / 2 83
Jika (Data[m] = x) maka ketemu ← true
Jika (x < Data[m]) maka R ← m – 1 Jika (x > Data[m]) maka L ← m + 1
.
8. Jika (ketemu) maka m adalah indeks dari data yang dicari, jika tidak data tidak ditemukan
int binary_search(int cari){
int l,r,m;
l = 0;
r = n-1;
int ktm = 0;
while(l<=r && ktm==0){
m = (l+r)/2;
if(data[m] == cari) ktm=1;
else if (cari < data[m]) r=m-1;
else l=m+1; {
if(ktm==1) return 1; else return 0;
}
}
}
4. Algoritma Shorting
ada beberapa Algoritma Sorting, yaitu :
1. Insertion Sort
Salah satu algoritma sorting yang paling sederhana adalah insertion sort. Ide dari
algoritma ini dapat dianalogikan seperti mengurutkan kartu. Penjelasan berikut ini
menerangkan bagaimana algoritma insertion sort bekerja dalam pengurutan kartu.
Anggaplah anda ingin mengurutkan satu set kartu dari kartu yang bernilai paling kecil
hingga yang paling besar. Seluruh kartu diletakkan pada meja,sebutlah meja ini sebagai meja
pertama, disusun dari kiri ke kanan dan atas ke bawah. Kemudian kita mempunyai meja yang
lain,meja kedua, dimana kartu yang diurutkan akan diletakkan. Ambil kartu pertama yang
terletak pada pojok kiri atas meja pertama dan letakkan pada meja kedua. Ambil kartu kedua
dari meja pertama, bandingkan dengan kartu yang berada pada meja kedua, kemudian
letakkan pada urutan yang sesuai setelah perbandingan. Proses tersebut akan berlangsung
hingga seluruh kartu pada meja pertama telah diletakkan berurutan pada meja kedua.
Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi dua
bagian, yang belum diurutkan (meja pertama) dan yang sudah diurutkan (mejakedua).
Elemen pertama diambil dari bagian array yang belum diurutkan dan kemudian diletakkan
sesuai posisinya pada bagian lain dari array yang telah diurutkan. Langkah ini dilakukan
secara berulang hingga tidak ada lagi elemen yang tersisa pada bagian array yang belum
diurutkan.
Cara kerja insertion sort sebagaimana namanya.Pertama-tama, dilakukan iterasi,
dimana di setiap iterasi insertion sort memindahkan nilai elemen,kemudian menyisipkannya
berulang-ulang sampai ketempat yang tepat. Begitu seterusnya dilakukan. Dariproses
iterasi, seperti biasa, terbentuklah bagian yang telah di-sorting dan bagian yang belum disorting.
Algoritma Insertion Sort
Algoritma Insertion Sort dapat dirangkum sebagai berikut
1. Simpan nilai Ti kedalam variabel sementara, dengan i = 1.
2. Bandingkan nilainya dengan elemen sebelumnya.\Jika elemen sebelumnya (Ti-1) lebih
besar nilainya daripada Ti, maka tindih nilai Ti dengan nilai Ti-1 tersebut. Decrement i
(kurangi nilainya dengan 1).
3. Lakukan terus poin ke-tiga, sampai Ti-1 ≤ Ti.
4. Jika Ti-1 ≤ Ti terpenuhi, tindih nilai di Ti dengan variabel sementara yang disimpan
sebelumnya.
5. Ulangi langkah dari poin 1 di atas dengan i di-increment (ditambah satu).
2. Bubble short
Bubble Sort merupakan cara pengurutan yangsederhana. Konsep dari ide dasarnya
adalah seperti“gelembung air” untuk elemen struktur data yangsemestinya berada pada
posisi awal. Cara kerjanyaadalah dengan berulang-ulang melakukan traversal (proses
looping) terhadap elemen-elemen struktur datayang belum diurutkan. Di dalam traversal
tersebut,nilai dari dua elemen struktur data dibandingkan. Jikaternyata urutannya tidak
sesuai dengan “pesanan”,maka dilakukan pertukaran (swap). Algoritma sortingini disebut
juga dengan comparison sort dikarenakanhanya mengandalkan perbandingan nilai elemen
untuk mengoperasikan elemennya.
Algoritma Bubble Sort
Algoritma bubble sort dapat diringkas sebagaiberikut, jika N adalah panjang elemen struktur
data, dengan elemen-elemennya adalah T1, T2, T3, …, TN-1,TN, maka:
1. Lakukan traversal untuk membandingkan dua elemen berdekatan. Traversal ini dilakukan
dari belakang.
2. Jika elemen pada TN-1 > TN , maka lakukan pertukaran (swap). Jika tidak, lanjutkan ke
proses traversal berikutnya sampai bertemu dengan bagian struktur data yang telah
diurutkan.
3. Ulangi langkah di atas untuk struktur data yang tersisa.
3. Selection Sort
Jika anda diminta untuk membuat algoritma sorting tersendiri, anda mungkin akan
menemukan sebuah algoritma yang mirip dengan selection sort. Layaknya insertion
sort, algoritma ini sangat rapat dan mudah untuk diimplementasikan. Mari kita kembali
menelusuri bagaimana algoritma ini berfungsi terhadap satu paket kartu. Asumsikan bahwa
kartu tersebut akan diurutkan secara ascending. Pada awalnya, kartu tersebut akan disusun
secara linier pada sebuah meja dari kiri ke kanan, dan dari atas ke bawah. Pilih nilai kartu
yang paling rendah, kemudian tukarkan posisi kartu ini dengan kartu yang terletak pada
pojok kiri atas meja. Lalu cari kartu dengan nilai paling rendah diantara sisa kartu yang
tersedia. Tukarkan kartu yang baru saja terpilih dengan kartu pada posisi kedua. Ulangi
langkah–langkah tersebut hingga posisi kedua sebelum posisi terakhir dibandingkan dan
dapat digeser dengan kartu yang bernilai lebih rendah.Ide utama dari algoritma selection
sort adalah memilih elemen dengan nilai paling rendah dan menukar elemen yang terpilih
dengan elemen ke-i. Nilai dari i dimulai dari 1 ke n, dimana n adalah jumlah total elemen
dikurangi
Algoritma sorting sederhana yang lain adalahSelection Sort. Ide dasarnya adalah melakukan
beberapa kali pass untuk melakukan penyeleksianelemen struktur data. Untuk sorting
ascending(menaik), elemen yang paling kecil di antara elemenelemenyang belum urut, disimpan
indeksnya,kemudian dilakukan pertukaran nilai elemen denganindeks yang disimpan tersebut
dengan elemen yangpaling depan yang belum urut. Sebaliknya, untuksorting descending
(menurun), elemen yang paling. besar yang disimpan indeksnya kemudian ditukar.
Algoritma Selection Sort
Algoritma selection sort dapat dirangkum sebagaiberikut:
1. Temukan nilai yang paling minimum (atau sesuaikeinginan) di dalam struktur data. Jika
ascending, maka yang harus ditemukan adalah nilai yang paling minimum. Jika
descending, maka temukan nilai yang paling maksimum.
2. Tukar nilai tersebut dengan nilai pada posisipertama di bagian struktur data yang belum
diurutkan.
Ulangi langkah di atas untuk bagian struktur data yang tersisa
4. Merge Sort
Sebelum mendalami algoritma merge sort, mari kita mengetahui garis besar dari konsep
divide and conquer karena merge sort mengadaptasi pola tersebut. Pola Divide and Conquer
Beberapa algoritma mengimplementasikan konsep rekursi untuk menyelesaikan
permasalahan. Permasalahan utama kemudian dipecah menjadi sub-masalah, kemudian
solusi dari sub-masalah akan membimbing menuju solusi permasalahan utama.
Pada setiap tingkatan rekursi, pola tersebut terdiri atas 3 langkah.
- Divide
Memilah masalah menjadi sub masalah
- Conquer
Selesaikan sub masalah tersebut secara rekursif. Jika sub-masalah tersebut cukup
ringkas dan sederhana, pendekatan penyelesaian secara langsung akan lebih efektif
- Kombinasi
Mengkombinasikan solusi dari sub-masalah, yang akan membimbing menuju
penyelesaian atas permasalahan utama
Algoritma Merge Sort ditemukan oleh John vonNeumann di tahun 1945. Merge Sort termasuk
paradigma algoritma divide and conquer (kurang lebih berarti: bagi dan atasi). Hal ini
dikarenakan algoritma ini melakukan pembagian struktur data sebelum kemudian dioperasi satu
per satu. Intinya, algoritma ini menggunakan dua ide utama sebagai berikut,
1. Sebuah list yang kecil membutuhkan langkah yang lebih sedikit untuk pengurutan
daripada sebuah list yang besar.
2. Untuk membentuk sebuah list terurut dari duabuah list terurut membutuhkan langkah
yangl ebih sedikit daripada membentuk sebuah list terurut dari dua buah list tak terurut.
Contoh:hanya diperlukan satu kali traversal untuk masing-masing list jika keduanya
sudahterurut.
\
Algoritma Merge Sort
Algoritma Merge Sort sederhananya, dapat ditulis berikut:
1. Bagi list yang tak terurut menjadi dua sama panjang atau salah satunya lebih panjang satu
elemen.
2. Bagi masing-masing dari 2 sub-list secara rekursif sampai didapatkan list dengan ukuran 1.
3. Gabung 2 sublist kembali menjadi satu list terurut.
5. Quicksort
Quicksort ditemukan oleh C.A.R Hoare. Seperti pada merge sort, algoritma ini juga
berdasar pada pola divide-and-conquer. Berbeda dengan merge sort, algoritma ini hanya
mengikuti langkah – langkah sebagai berikut :
Quick Sort adalah algoritma sorting yang terkenal yang dirancang oleh C.A.R. Hoare pada
tahun 1960 ketika bekerja untuk perusahaan manufaktur komputer saintifik kecil, Elliott
Brothers. Algoritma ini rekursif, dan termasuk paradigma algoritma divide and conquer.
Algoritma Quick Sort
Algoritma ini terdiri dari 4 langkah utama:
1. Jika struktur data terdiri dari 1 atau 0 elemen yang harus diurutkan, kembalikan struktur
data itu apa adanya.
2. Ambil sebuah elemen yang akan digunakansebagai pivot point (poin poros). (Biasanya
elemen yang paling kiri.)
3. Bagi struktur data menjadi dua bagian – satu dengan elemen-elemen yang lebih besar
daripada pivot point, dan yang lainnya dengan elemen-elemen yang lebih kecil dari pada
pivot point.
4. Ulangi algoritma secara rekursif terhadap kedua paruh struktur data.
Contoh Program sorting pada C++
contoh program sort c++ :
#include <iostream.h>
#include <conio.h>
int data[100],data2[100];
int n;
void tukar(int a,int b)
{
int t;
t = data[b];
data[b] = data[a];
data[a] = t;
}
void bubble_sort()
{
for(int i=1;i<n;i++)
{
for(int j=n-1;j>=i;j–)
{
if(data[j]<data[j-1]) tukar(j,j-1);
}
}
cout<<”bubble sort selesai!”<<endl;
}
void exchange_sort()
{
for (int i=0; i<n-1; i++)
{
for(int j = (i+1); j<n; j++)
{
if (data [i] > data[j]) tukar(i,j);
}
}
cout<<”exchange sort selesai!”<<endl;
}
void selection_sort()
{
int pos,i,j;
for(i=0;i<n-1;i++)
{
pos = i;
for(j = i+1;j<n;j++)
{
if(data[j] < data[pos]) pos = j;
}
if(pos != i) tukar(pos,i);
}
cout<<”selection sort selesai!”<<endl;
}
void insertion_sort()
{
int temp,i,j;
for(i=1;i<n;i++)
{
temp = data[i];
j = i -1;
while(data[j]>temp && j>=0)
{
data[j+1] = data[j];
j–;
}
data[j+1] = temp;
}
cout<<”insertion sort selesai!”<<endl;
}
void QuickSort(int L, int R) //the best sort i’ve ever had
{
int i, j;
int mid;
i = L;
j = R;
mid = data[(L+R) / 2];
do
{
while (data[i] < mid) i++;
while (data[j] > mid) j–;
if (i <= j)
{
tukar(i,j);
i++;
j–;
};
} while (i < j);
if (L < j) QuickSort(L, j);
if (i < R) QuickSort(i, R);
}
void Input()
{
cout<<”Masukkan jumlah data = “; cin>>n;
for(int i=0;i<n;i++)
{
cout<<”Masukkan data ke-”<<(i+1)<<” = “; cin>>data*i+;
data2[i] = data[i];
}
}
void Tampil()
{
cout<<”Data : “<<endl;
for(int i=0;i<n;i++)
{
cout<<data*i+<<” “;
}
cout<<endl;
}
void AcakLagi()
{
for(int i=0;i<n;i++)
{
data[i] = data2[i];
}
cout<<”Data sudah teracak!”<<endl;
}
void main()
{
int pil;
clrscr();
do
{
clrscr();
cout<<”Program Sorting Komplit!!!”<<endl;
cout<<”*********************************************”<<endl;
cout<<” 1. Input Data”<<endl;
cout<<” 2. Bubble Sort”<<endl;
cout<<” 3. Exchange Sort”<<endl;
cout<<” 4. Selection Sort”<<endl;
cout<<” 5. Insertion Sort”<<endl;
cout<<” 6. Quick Sort”<<endl;
cout<<” 7. Tampilkan Data”<<endl;
cout<<” 8. Acak Data”<<endl;
cout<<” 9. Exit”<<endl;
cout<<” Pilihan Anda = “; cin>>pil;
switch(pil)
{
case 1:Input(); break;
case 2:bubble_sort(); break;
case 3:exchange_sort(); break;
case 4:selection_sort(); break;
case 5:insertion_sort(); break;
case 6:QuickSort(0,n-1);
cout<<”quick sort selesai!”<<endl;
break;
case 7:Tampil(); break;
case 8:AcakLagi(); break;
}
getch();
}while(pil!=9);
}
5. Stuktur Data Bentukan
Tipe data bentukan adalah tipe data yang dibuat sendiri sesuai kebutuhan dalam program
yang akan kita buat (disebut juga user defined types). Adapun yang termasuk ke dalam tipe
bentukan adalah :

Sruktur
Struktur adalah tipe data bentukan yang menyimpan lebih dari satu variabel bertipe
sama maupun berbeda. Untuk mumbuat tipe data struktur dalam C, menggunakan kata kunci
struct. Bentuk umum pendeklarasian tipe:
Struct nama struktur {
Tipe_data variabel1;
Tipe_data variabel2;
...}
Download
Study collections