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; ...}