Diana Cindy Agustin UMSIDA
Assalamualaikum Wr. Wb.
Kembali lagi bersama saya Diana dan kali ini kita akan membahas tentang Algoritma dan Struktur Data. Semoga bisa membantu untuk kalian yang membaca yaaLet's Go!
POKOK
BAHASAN 1
STRUKTUR DATA, ARRAY, POINTER, DAN STRUKTUR
PENDAHULUAN
Pada
pokok bahasan ini berisi penjelasan disertai contoh mengenai konsep struktur
data, array, pointer, dan struktur yang menjadi pemahaman dasar bagi mahasiswa
sebelum mempelajari struktur data, dimana konsep array, pointer, dan struktur
digunakan untuk mempresentasikan sebuah struktur data, diharapkan mahasiswa
dapat :
- Mengaetahui
konsep dasar struktur data.
- Memahami
konsep array, ponter, dan struktur.
PENYAJIAN (TUTORIAL)
- Konsep
Dasar Struktur Data
Struktur
data adalah sebuah bagian dari ilmu pemrograman dasar yang mempunyai
karakteristik yang terkait dengan sifat dan cara penyimpanan sekaligus
penggunaan atau pengaksesan data.
Struktur
data bertujuan agar cara mempresentasikan datadalam membuat program dapat
dilakukan secara efisien dalam pengolahan di memori dan pengolahan penyimpanan
dari program ke storage juga lebih mudah dilakukan.
- Konsep
Dasar Array
Array
adalah kumpulan elemen-elemen data. Kumpulaan elemen tersebut mempunyai suusnan
tertentu yang teratur. Jumlah elemen terbatas, dan semua elemen mempunyai tipe
data yang sama. Jenis-jenis array:
Array
Satu Dimensi
Struktur
array satu dimensi dapat dideklarasikan dengan bentuk umum berupa : tipe_var
nama_var[ukuran];
Dengan
:
-
Tipe_var
: untuk menyatakan jenis elemen array (misalnya int, char, unsigned).
-
Nama_var
: untuk menyatakan nama variabel yag dipakai.
-
Ukuran
: untuk menyatakan jumlah maksimal elemen array.
Contoh
: float nilai_ujian[5];
Array
Dua Dimensi
Tipe
data array dua dimensi biasa digunakan untuk menyimpan, mengolah maupun
menampilkan suatu data dalam bentuk table atau matriks. Untuk mendeklarasikan
array agar dapat menyimpan data adalah :
Tipe_var
nama_var[ukuran1][ukuran2];
Dimana
:
-
Ukuran
1 menunjukkan jumalah/nomor baris.
-
Ukuran
2 menunjukkan jumlah/nomor kolom.
Jumlah
elemen yang dimiliki array dua dimensi dapat ditentukan dari hasil perkalian :
Ukuran1
x ukuran2.
Seperti
halnya pada array satu dimensi, data array dua dimensi akan ditempatkan pada
memori secara berurutan.
Array
Multidimensi / Dimensi Banyak
Array
berdimensi banyak atau multidimensi terdiri array yang tidak terbatas hanya dua
dimensi saja. Bentuk umum pendeklarasian array multidimesni adalah : tipe_var
nama_var[ukuran1][ukuran2]…[ukurann];
Contoh
: int data_angaka[3][6][6];
Yang
merupakan array tiga dimensi
Mengakses Elemen Array
:
Dalam
Bahasa C++, data array akan disimpan dalam memori pada alokasi yang berurutan.
Elemen
pertama biasanya mempunyai. indeks bernilai 0. Contoh :
Float
nilai_tes[5];
Jika
pada contoh diatas, variabel nilai_tes mempunyai 5 elemen, maka elemen pertama
mempunyai indeks sama dengan 0, elemen kedua mempunyai indeks 1, dan
seterusnya. Bentuk umum pengaksesan suatu elemen variabel array adalah :
Nama_var[indeks];
Gambar
berikut memperlihatkan urutan komponen array dalam memori.
Untuk
variabel array nilai_tes :
Gambar 1.1 Struktur Array Satu Dimensi
Inisialisasi Array :
Array dapat diinisialisasikan
secara langsung saat pertama kali dideklarasikan (efisien untuk array
berdimensi sedikit).
Contoh : int x[2]={1,2};
Array dapat dideklarasikan
terlebih dahulu, baru kemudian diisi elemnya.
Contoh :
Int x[2];
x[0]=1;
x[1]=2;
- Konsep Dasar Pointer
Pointer adalah sebuah variabel
yang berisi lamat variabel yang lain. Suatu ponter dimaksudkan untuk meunjuk
koperatore suatu alamat memori sehingga alamat dari suatu variabel dapat
diketahui dengan mudah. Deklarasi pointer :
Operator
painter :
Operator
‘&’ : untuk mendapatkan alamat memori operand/variabel pointer.
Operatot
‘*’ : untuk mengakses nilai data operand/variabel pointer.
- Konsep
Dasar Struktur
Struktur
adalah koleksi dari variabel yang dinyatakan dengan sebuah nama, dengan sifat
setiap variabel dapat memiliki tipe yang berlainan.
Struktur
biasa dipakai untuk mengelompokkan beberapa informasi yang berkaitanmenjadi
sebuah satu kesatuan. Contoh sebuah struktur adalah informasi data tanggal,
yang berisi tanggal, bulan, dan tahun.
Mendeklarasikan
Struktur :
Contoh
pendefisinian tipe data struktur adalah : struct
Data_tanggal
{
int tanggal;
Masing
– masi tioe dari elemen struktur dapat berlainan. Adapun variabel_struktur1
sampai dengan variabel_struktur M menyatakan bahwa variabel struktur yag
dideklarasikan bisa lebih dari satu. Jika ada lebih dari satu variabel, antara
variabel struktur dipisahkan dengan tandakoma.
Mengakses Elemen
Struktur :
Elemen
dari struktur dapat diakses dengan menggunakan bentuk :
Variabel_struktur.nama_field
Antara
variabel_struktur dana nama_field dipisahkan dengan operator titik (disebut
operator anggota struktur). Contoh berikut merupakan instruksi untuk mengisikan
data padafield tanggal :
tgl_lahir.tang
gal=30 int
bulan;
int tahun;
};
Yang
mendefinisikan tipe
struktur bernama data_tanggal,
yang terdiri dari tiga buah elemen berupa tanggal, bulan, dan tahun. Bentuk
umum dalam mendefinisikan dan mendeklarasikan struktur adalah :
Struct
nama_tipe_struktur
{
Tipe
filed1
;Tipe
field2
;Tipe
field3
;
}variabel_struktur1….variabel_strukturM;
Berikut ini salah satu contoh programnya :
Syntax
#include<stdio.h>
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
int square[100];
int i;
int k;
//Perhitungan
for (i=0; i<10; i++)//angka yang ditampilkan 1-10
{
k=i+1;
square[i]=k*k;
printf("\n Pangkat dari %d adalah %d", k, square[i]);
}
_getch();
}
Output :
POKOK
BAHASAN 2
LINKED LIST (SENARAI)
PENDAHULUAN
Pada
pokok bahasan ini akan dibahas mengenai sruktur data senarai (list) yang
pembahasannya meliputi definisi dan representasi list, jenis-jenis list serta
oerasi-operasi dasar pada list. Sehingga setelah mempelajari bab ini diharapkan
maahasiswa mampu :
- Menjelaskan
definisi dan representasi list.
- Mengetahui
jenis-jenis list.
- Memahami
operasi-operasi pada list.
PENYAJIAN (TUTORIAL)
Linked list
adalah sejumlah objek atau elemen yang dihubungkan satu dengan lainnya sehingga
membentuk suatu list. Sdangkan objek atau elemen itu sendiri adalah merupakan
gabungan beberapa data (variabel) yang dijadikan satu kelompok atau structure
atau record yang dibentuk dengan
perintah struct. Untuk menggabungkan
objek satu dengan lainnya, diperlukan paling tidak sebuah variabel yang bertipe
pointer. Syarat linked list adalah
harus adapat diketahui alamat simpul pertama atau biasa dipakai variabel First/Start/Header. Struktur dasar
sebuah list seperti gambar berikut :
Gambar 2.1 List Tunggal
Istilah
– istilah dalam linked list :
-
Simpul
Simpul terdiri dari dua bagian
yaitu :
a. Bagian data
b. Bagian pointer yang menunjuk ke simpul berikutnya
-
First/Header
Variabel
First/Header berisis alamat (pointer)/acuan
(reference) yag menunjuk lokasi
simpul pertama linked list, digunakan
sebagai awal penelusuran linked list.
-
Nil/Null
Tidak
bernilai, digunakan untuk menyatakan tidak mengacu ke manapun.
-
Simpul Terakhr (Last)
Simpul
terakhir linked list berari tidak menunjuk simpul berikutnya. Tidak terdapat
alamat disimpan di field pointer
(bagian kedua dari simpul). Nilai null atau nil disimpan di field pointer di simpul terakhir.
Jenis – jenis linked list :
List
kosong
List kosong hanya terdiri dari
sebuah petujuk elemen yang berisi NULL (kosong), tidak memiliki satu buah
elemen pun sehigga hanya berupa penunjuk awal elemn berisi NULL.
List
Tunggal
List
tuggal adalah list yang elemenya hanya menyimpan informasi elemen setelahnya (next), sehingga jalanya pengaksessan
list hanya dapat dilakukan secara maju. List tuggal terbagi menjadi tiga jenis
yaitu list tunggal dengan kepala (first),
list tunggal kepala (first) dan ekor (tail), serta list tunggal yang
berputar.
Gambar 2.2 List Tunggal dengan Kepala dan Ekor, List Tunggal Berputar
List
Ganda
List
ganda adalah sebuah list yang elemenya menyimpan informasi elemen sebelumnya
dan informasi elemen setelahnya, sehingga proses penelusuan list dapat
dilakukan secara maju dan mundur. List ganda terbagi menjadi tiga jenis yaitu
list ganda engan kepala (first), list
ganda dengan kepala (first) dan ekor (tail), serta list ganda yag berputar.
Gambar 2.3 List ganda dengan Kepala, List ganda dengan Kepala dan Ekor
Operasi Dasar pada Linked List :
IsEmpty
: Fungsi ini menentukan apakan linked list kosong atau tidak.
Size
: operasi untuk mengirim jumlah elemen di linked list.
Create
: operasi untuk penciptaan list baru yang kosong.
Insertfirst
: operasi penyisipan simpul sebagai simpul pertama.
Insertafter
: operasi untu penyisispan simpul setelah simpul tertentu.
Insertlast
: operasi untuk penyisipan simpul sebagai simpul terakhir.
Insertbefore
: operasi untuk penyisipan simpul sebelum simpul tertentu.
Deletefirst
: operasi penghapusan simpul pertama.
Deleteafter
: operasi penghapusan setelah simpul tertentu.
Deletelast
: operasi penghapusan simpul terakhir.
Berikut ini salah satu contoh programnya
Syntax :
#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
typedef struct nod
{
int data;
struct nod *next;
}NOD, *NODPTR;
void CiptaSenarai(NODPTR *s)
{
*s = NULL;
}
NODPTR NodBaru(int m)
{
NODPTR n;
n = (NODPTR) malloc
(sizeof(NOD));if(n!=NULL)
{
n->data=m;
n->next=
NULL;
}
return n;
}
void SisipSenarai(NODPTR *s, NODPTR t, NODPTR p)
{
if(p==NULL)
{
t->next=*s;
*s=t;
}
else
{
t->next=p->next;
p->next=t;
}
}
void CetakSenarai(NODPTR s)
{
NODPTR ps;
for(ps=s; ps!=NULL; ps=ps->next)
printf("%d-->", ps->data);
printf("NULL\n");
}
int main()
{
NODPTR pel;
NODPTR n;
CiptaSenarai(&pel);
n=NodBaru(55);
SisipSenarai(&pel, n, NULL);
n=NodBaru(75);
SisipSenarai(&pel, n, NULL);
CetakSenarai(pel);
_getch();
}
Output
POKOK
BAHASAN 3
STACK (TUMPUKAN)
PENDAHULUAN
Pada
pokok bahasan ini akan dibahs mengenai struktur datatumpukan atau stack, dimana
stack merupakan suatu kumpulan data yang seolah-olah ada data yang diletakkan
di ats data yang lain. Setelah mempelajari materi ini diharapkan mahasiswa
mampu untuk :
- Mengetahui
dan memahami definisi stack.
- Memahami
operasi-operasi dasar stack.
- Memahami
representasi statis dan dinamis stack.
PENYAJIAN (TUTORIAL)
Stack
adalah kumpula elemen-elemen yang tersimpan dalam suatu tumpukan. Aturan
penyisispan dan penghapusan elemennya tertentu :
-
Penyisispan
selalu dilakukan “di atas “ TOP
-
Penghapusan
selalu dilakukan pada TOP
Karena
aturan penyisipan dan penghapusan semacam itu, TOP adalah satu-satunya alamat
tempat terjadi operasi, elemen yang ditambahkan paling akhir akan menjadi
elemen yang akan dihapus. Dikatakan bahwa elemen Stack tersususn secara LIFO (Last In First Out).
Seperti
halnya jika kita mempunyai sebuah tumpukan buku, agar tumpukan buku itu tidak
ambruk ketika kita mengambil sebuah buku di dalam tumpukan itu amaka harus
diambil satu per satu dari tumpukan yang paling atas dari tumpukan.
Gambar 3.1 Ilustrasi Stack
Perhatikan bahwa dengan definsi
semacam ini, representasi tabel sangat tepat untuk mewakili stack, karena
operasi penambahan dan pengurangan hanya dilakukan disalah satu ujung tabel.
Beberapa contoh penggunaan stack
adalah pemanggilan prosedur, perhitugan ekspresi aritmatika, rekursifitas,
backtracking, peaganan interupsi, dan lain-lain. Karakteristik penting stack
sebagai berikut :
- Elemen stack yaitu item-item
data di elemen stack
- TOP (elemen puncak dari stack)
- Jumlah elemen pada stack
- Status/kondisi stack, yaitu :
-
Penuh
Bila
elemen di tumpukan mencapai kapasitas maksimum tumpukan. Pada kondisi ini,
tidak mungkin dilakukan penambahan ke tumpukan.Penambahan di elemen
menyebabakan kondisi kesalahan Overflow.
-
Bila tidak ada elemen tumpukan.
Pada kondisi ini, tidak mungkin dilakukan pengambilan elemen tumpukan.
Pengambilan elemen menyebabkan kondisi kesalahan Underflow.
Stack memiliki operasi-operasi
pokok sebagai berikut :
Push : Untuk menambahkan item pada tumpukan paling atas.
void Push (itemType x, Stack*S)
{
If(Full
(S))
Printf(“Stack
FULL”);
else
{
S->item[S->Count]=x;
++(S->count);
}
}
Pop : Untuk mengambil item teratas
int Pop (Stack S, itemType x)
{
if
(Empty (S))
Printf(“Stack
Kosong”);
else
{
-(S->Count);
x=s->item(s->Count);
}
}
Clear : Untuk mengosongkan stack
void InitializeStack (Stack S)
{
S->Count=0;
}
IsEmpty : Untuk memerikasa apakah stack kosong
int Empty (Stack *S)
{
return
(S->Count==0);
}
IsFull : Untuk memeriksa apakah stack
sudah penuh
int Full (Stack S)
{
return(S->Count==MAXSTACK);
}
Representasi stack :
-
Representasi statis
Stack
dengan representasi statis biasanya diinplementasikan dengan menggunakan array.
Sebuah array memiliki tempat yang dialokasikan diawal sehingga sebuah elemen
yang dimasukan dalam sebuah array terbatas pada tempat yang ada pada array.
Karena menggunakan array maka stack dengan representasi statis dalam mengalami
kondisi elemen penuh. Ilustrasi stack dengan representasi statis dapat dilihat pada gambar 3.2 :
Gambar 3.2 Representasi Stack Statis
-
Representasi dinamis
Stack
dengan representasi dinamis biasanya diimplementasikan dengan menggunakan
pointer yang mnunjuk pada elemen-elemen yang dialokasikan pada memori.
Illustrasi stack dengan representasi dinamis dapat dilihat pada gambae 3.3 :
Gambar
3.3 Representasi Stack Dinamis
Karena
semua operasi pada sebuah stack diawali dengan elemen yang paling atas maka
jika menggunakan representasi dinamis saat elemen ditambahkan akan mengguakan penambahan
elemenpada awal stack (addfirst) dan
saat pengambilan atau penghapusan elemen menggunakan penghapusan di awal stack (delfirst).
Berikut ini salah satu contoh progaramnya
Syntax
#include<stdio.h>
#include<conio.h>
#include<iostream>
#define MAXSTACK 3
typedef int itemType;
typedef struct
{
int item[MAXSTACK];
int jml;
} Stack;
void init(Stack*s)
{
s->jml=0;
}
int kosong(Stack*s)
{
return(s->jml==0);
}
int penuh(Stack *s)
{
return (s->jml==MAXSTACK);
}
void isi(itemType x, Stack *s)
{
if(penuh(s))
printf("\nMAAF!!! Data
PENUH\n");
else{
s->item[s->jml]=x;
++(s->jml);
}
}
void ambil(Stack*s, itemType *x){
if(kosong(s))
printf("\nMaaf Data
Kosong\n");
else
{
--(s->jml);
*x=s->item[s->jml];
s->item[s->jml]=0;
printf("\nData
%i Berhasil Diambil\n",*x);
}
}
void tampil(Stack *s){
if(kosong(s))
printf("\nMaaf Data Masih
Kosong\n");
else
printf("\n");
for(int
i=s->jml-1;i>=0;i--){
printf("Data :
%d\n",s->item[i]);
}
}
void hapus(Stack *s){
s->jml=0;
printf("\nSemua Data Berhasil
Dihapus\n");
}
main(){
int pil;
Stack tumpukan;
itemType data;
init(&tumpukan);
do{
printf("\nMENU
: \n 1. Isi (Data Angka)\n 2. Ambil\n 3. Lihat\n 4. Hapus (Hapus Semua Data)\n
5. Keluar\n");
printf("\n");
printf("Masukkan
Pilihan : ");
scanf("%i",
&pil);
switch (pil){
case 1:
printf("\nMasukkan
Data Angka : ");
scanf("%i",&data);;isi(data,&tumpukan);
break;
case 2:
ambil(&tumpukan,&data);
break;
case 3:
tampil(&tumpukan);
break;
case 4:
hapus(&tumpukan);
break;
}
}while(pil!=5);
getch();
}
Output
POKOK BAHASAN 4
QUEUE (ANTRIAN)
PENDAHULUAN
Pada pokok bahasan ini akan dibahas mengenai antrian atau queue,
dimana struktur data hamper sama dengan tumpukan atau stack yang merupakan
struktur data yang linier. Perbedaanya
adalah operasi penambahan dan pengurangan pada ujung yang berbeda. Setelah
mempelajari materi ini diharapkan mahasiswa mampu :
- Mengetahui dan memahami definisi antrian.
- Memahami operasi-operasi dasar pada antrian.
- Memahami representasi statis dan dinamis pada
antrian.
PENYAJIAN (TUTORIAL)
Antrian adalah suatu
kumpulan data yang penambahan elemenya hanya bisa dilakukan pada suatu ujung
(disebut sisi belakang atau REAR), dan penghapusan atau pengambilan elemen
dilakukan lewat ujung yang lain (disebut sisi depan atau FRONT). Prinsip yang
digunakan dalam antrian ini adalah FIFO (First
In First Out) yaitu elemen yang pertama kali masuk akan keluar pertama
kalinya.
Penggunaan antrian antara lain simulasi antrian di dunia nyata
(antrian pembelian tiket), sistem jaringan computer (pemrosesan banyak paket
yang dating dari banyak koneksi pada host,
bridge, gateway), dan lain-lain.
Gambar 4.1 Ilustrasi Antrian dengan 8 Elemen
Karakteristrik penting
antrian sebagai berikut :
- Elemen antrian yaitu
item-item data yang terdapat dalam antrian.
- Head/front (elemen terdepan antrian).
- Tail/rear (elemen terakhir antrian).
- Jumlah antrian pada antrian (count).
- Status/kondisi antrian, ada
dua yaitu :
-
Penuh
Bila
elemen di antrian mencapai kapasitas maksimum antrian. Pada kondisi ini, tidak
mungkin dilakukan penambahan ke antrian. Penambahan di elemen menyebabkan
kondisi kesalahan Overflow.
-
Kosong
Bila tidak ada elemen antrian. Pada kondisi ini, tidak
mungkin dilakukan pengambilan elemen antrian. Pengambilan elemen menyebabkan
kondisi kesalahan Underflow.
Operasi-operasi pokok pada antrian diantaranya adalah :
- Create Membuat antrian baru.
NOEL(CREATE(Q))=0
FRONT(CREATE(Q))=tidak terdefinisi
REAR(CREATE(Q)=tidak terdefinisi
- IsEmpty Untuk memeriksa
apakah antrian sudah penuh atau belum.
ISEMPTY(Q)=True,
jika Q adalah queue penuh.
- IsFull Mengecek apakah
antrian sudah penuh atau belum.
ISFULL(Q)=True,
jika Q adalah queue penuh.
- Enqueue/Insert Menambahkan
elemen kke dalam antrian, penambahan elemen selalu ditambahkan di dalam
elemen paling belakang.
REAR(INSERT(A,Q))=A
ISEMPTY(INSERT(A,Q))=FALSE
Algoritma
QINSERT :
a. IF FRONT = 1 AND REAR = N, OR IF FRONT = REAR +
1,
THEN OVERFLOW, RETURN
b. IF FRONT := NULL, THEN
SET
FRONT := 1 AND REAR := 1
ELSE
IF REAR = N,
THEN
SET REAR := 1
ELSE
SET
REAR := REAR+!
c. SET QUEUE[REAR] := ITEM
d. RETURN
- Dequeu/Remove Unttuk
menghapus elemen terdepan/pertama dari antrian.
Algoritma
QDELETE :
a. IF FRONT := NULL, THEN UNDERFLOW, RETURN
b. SET ITEM := QUEUE{FRONT]
c. [FIND NEW VALUE OF FRONT] IF FRONT = REAR, THEN
SET
FRONT := NULL AND REAR
;=NULL
ELSE IF FRONT = N, THEN
SET FRONT := 1
ELSE
SET FRONT := FRONT+!
d. RETURN
Representasi
Queue :
Representasi
statis
Queue dengan representasi
statis biasanya diimplementasikan dengan menggunakan array. Sebuah array
memiliki tempat yang dialokasikan diawal sehingga sebuah elemen yang dimasukkan
dalam sebuah array terbatas pada tempat yang ada pada array. Karena menggunakan
array maka queue dengan representasi statis dalam mengalami kondisi elemen
penuh. Ilustrasi queue dengan representasi statis dapat
dilihat pada gambar :
Gambar 4.2 Representasi Queue Statis
Representasi dinamis
Queue dengan representasi dinamis biasanya
diimplementasikan dengan menggunakan pointer yang menunjuk pada elemen-elemen
yang dialokasikan pada memori. Ilustrasi
queue dengan representasi dinamis dapat dilihat pada gambar :
Gambar 4.3 Representasi
Queue Dinamis
Beriku ini salah satu contoh programnya
Syntax
#include <queue>
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
queue <int> que;
que.push(10);
que.push(2);
que.push(3);
cout<<"Paling depan : "<<que.front()<<endl;
cout<<"Paling belakang : "<<que.back()<<endl;
que.pop();
cout<<"10 sudah dikeluarkan"<<endl;
cout<<"Paling depan : "<<que.front()<<endl;
cout<<"Paling belakang : "<<que.back()<<endl;
que.push(6);
cout<<"Angka 6 dimasukkan"<<endl;
cout<<"Paling depan : "<<que.front()<<endl;
cout<<"Paling belakang : "<<que.back()<<endl;
_getch();
}
Output :
POKOK
BAHASAN 5
REKURSIF
PENDAHULUAN
Pada pokok bahasan ini
akan dibahas mengenai rekursif. Setelah mempelajari bab ini diharapkan
mahasiswa mampu :
- Mengetahui dan memahami definisi rekursif.
- Memahami
sifat-sifat rekursif.
- Mengaplikasikan
rekursif.
PENYAJIAN
(TUTORIAL)
Fungsi rekursif adalah suatu fungsi yang memanggil dirinya sendiri,
artinya fungsi tersebut dipanggil di dalam tubuh fungsi itu sendiri. Contoh
menghitung nilai factorial. Rekursif sangat memudahkan untuk memecahkan
permasalahan yang kompleks. Sifat- sifat rekursif :
-
Dapat digunakan ketika inti dari
masalah terjadi berulang kali.
-
Sedikit lebih efisian dari iterasi tapi lebih elegan.
-
Method-methodnya dimungkinkan
untuk memanggil dirinya sendiri.
Data yang berada dalam method tersebut seperti argument disimpan
sementara ke dalam stack sampai method pemanggil diselesaikan.
Berikut ini salah satu contoh programnya
Syntax
#include <iostream>
#include <conio.h>
using namespace std;
void odd(int a);
void even(int a);
int main(void)
{
int
i;
do
{
cout<<"Masukkan
Bilangan 1 - 9(0 Untuk Keluar) : \n";
cin>>i;
odd(i);
cout<<endl;
}
while
(i!=0);
_getch();
}
void odd(int a)
{
if((a%2)!=0)
cout<<"Bilangan
GANJIL\n";
else
even(a);
}
void even(int a)
{
if((a%2)==0)
cout<<"Bilangan
GENAP\n";
else
odd(a);
}
Output :
POKOK
BAHASAN 6
SORTING
(PENGURUTAN)
PENDAHULUAN
Setelah mempelajari bab ini diharapkan mahasiswa mampu :
- Menunjukkan beberapa algoritma dalam pengurutan.
- Menunjukkan bahwa pengurutan merupakan suatu
persoalan yang bisa diselesaikan dengan sejumlah algoritma yang berbeda
satu sama lain.
- Dapat
memilih algoritma yang paling sesuai untuk menyelesaikan suatu
permasalahan pemrograman.
PENYAJIAN
(TUTORIAL)
Pengurutan data (sorting) didefinisikan sebagai suatu proses untuk
menyusun kembali himpunan obyek menggunkan aturan tertentu. Ada dua macam urutan yang bisa digunakan dalam proses pengurutan yaitu :
- Urutan
naik (ascending) yaitu dari data
yang mempunyai nilai paling kecil sampai paling besar.
- Urutan
turun (descending) yaitu dari
data yang mempunyai nilai paling besar sampai paling kecil.
Contoh : data bilangan 5, 2, 6, dan 4 dapat diurutkan naik menjadi
2, 4, 5, 6 atau diurutkan menjadi 6, 5, 4, 2. Pada data yang bertipe char,
nilai data dikatakan lebih kecil atau lebih besar dari yang lain didasarkan
pada urutan relative (collating sequence)
seperti dinyatakan dalam tabel ASCII. Keuntungan dari data yang sudah dalam
keadaan terurut yaitu :
Data mudah dicari, mudah untuk dibetulkan,
dihapus, disisipi atau digabungakan. Dalam keadaan terurutkan, kita mudah
melakukan pengecekan apakah ada data yang hilang. Misalnya kamus Bahasa, buku
telepon. Mempercepat proses pencarian data yang harus dilakukan berulang kali.
Beberapa factor yang
berpengaruh pada efektifitas suatu algoritma pengurutan antara lain :
-
Banyak data yang diurutkan.
-
Kapasitas pengingat apakah mampu
menyimpan semua data yang kita miliki.
-
Tempat penyimpanan data, misalnya
piringan, pita tau kartu, dll.
Beberapa algoritma metode
pengurutan dan prosedurnya sebagai berikut :
1. Bubble Sort
Bubble Sort adalah suatu metode pengurutan yang
membandingkan elemen yang sekarang dengan elemen berikutnya. Apabila elemen
sekarang > elemen berikutnya, maka posisinya ditukar. Kalua tidak, tidak
perlu ditukar. Diberi nama “Bubble” karena proses pengurutan secara berangsur-angsur
bergerak/berpindah ke posisinya yang tepat, seperti gelembung yang keluar dari
sebuah gelas bersoda.
Proses Bubble Sort:
Data paling akhir dibandingkan dengan data di
depanya, jika ternyata lebih kecil atau besar maka tukar sesuai dengan kekuatan
( descending atau ascending). Dan pengecekan yang sama dilakukan terhadap data
yang selanjutnya sampai data yang paling awal.
Gambar 6.1 Langkah 1 Bubble Sort
Gambar 6.2
Langkah 2 Bubble Sort
Gambar 6.3 Langkah 3 Bubble Sort
Algoritma Bubble Sort :
- i=0
- selama (i<N-1) kerjakan
baris 3 sampai 7
- j=N-1
- selama (j>=i) kerjakan
baris 5 sampai 7
- jika (Data[j-1] > Data[j])
maka tukar Data[j-1] dengan Data[j]
- j=j-1
- i=i+1
prosedur yang
menggunakan metode gelembung :
void BubbleSort()
{
int i,j;
for(i=1; i<Max; i++)
for(j=Max-1; j>=I; j--)
if(Data[j-1] > Data[j])
Tukar(&Data[j-1], &Data[j]);
}
2.
Selection Sort
Metode
seleksi melakukan pengurutan dengan cara mencari data yang terkecil kemudian
menukarkanya dengan data yang digunakan sebagai acuan atau sering dinamakan
pivot. Selama proses, pembandingan dan pengubahan hanya dilakukan
pada indeks pembanding saja, pertukaran data secara fisik terjadi pada akhir
proses. Proses pengurutan dengan metode seleksi dapat dijelaskan sebagai
berikut :
Langkah
pertama dicari data terkecil dari data pertama sampai data terakhir. Kemudian
data terkecil ditukar dengan data pertama. Dengan demikian, data pertama
sekarang mempunyai nilai paling kecil dibanding data yang lainnya.
Langkah kedua, data terkecil kita cari mulai dari data
kedua sampai terakhir. Data terkecil yang kita peroleh ditukar dengan data
kedua dan deikian seterusnya sampai semua elemen dalam keadaan terurutkan.
Gambar 6.4 Langkah
Selection Sort
Algoritma seleksi dapat
dituliskan sebagai berikut :
- i=0
- selama (i<N-1) kerjakan
baris 3 sampai dengan 9
- k=i
- j=i+1
- selama
(j<N) kerjakan baris 6 dan 7
- jika (Data[k] > Data[j])
maka k=j
- j=j+1
- Tukar Data[i] dengan Data[k]
- i=i+1
Di bawah ini merupakan
prosedur yang menggunakan metode seleksi :
void SelectionSort()
{
k=i;
for(j=i+1; j<Max; j++)
if(Data[k] > Data[j])
k=j;
Tukar(&Data[i], &Data[k]);
}
}
3.
Marger Sort
Algoritma
Marge Sort ialah algoritma pengurutan yang berdasarkan pada strategi dovide and conquer. Algoritma ini terdiri dari dua bagian utama, pembagian
list yang diberikan untuk di-sort ke dalam beberapa sublist yang lebih kecil,
dan sort (mengurutkan) dan marge (menggabungkan) sublist-sublist yang lebih kecil ke dalam list yang sudah
diurutkan. Pembagian bisa dikatakan cukup mudah karena sublist-sublist tersebut
dibagi kedalam dua sublist yang ukuranya adalah setengah dari ukuran semula.
Hal ini terus diulang sampai sublist itu cukup kecil untuk di-sort secara efisien (umumnya telah
terdiri dari satu atau dua elemen). Dalam langkah marge dua sublist disatukan kembali dan diurutkan
pada saat yang sama. Algoritma untuk merge
sort ialah sebagai berikut :
A.
Untuk kasus n=1, maka tabe a sudah terurut sendirinya
(langkah solve)
B.
Untuk kasus n>1, maka :
a.
DIVINE: bagi table a menjadi dua bagian, bagian kiri dan
bagian kanan, masing-masing bagian berukuran n/2 elemen.
b.
CONOQUER: secara rekursif, terapkan algoritma D-and-C pada
masing-masing bagian.
c.
MERGE: gabung hasil pengurutan kedua bagian sehingga
diperoleh table a yang terurut.
Berikut ini salah satu contoh programnya
Syntax
#include <iostream>
#include <conio.h>
#include <iomanip>
using namespace std;
int main(void)
{
int
dataku[]={5,34,32,25,75,42,2};
int
adaPertukaran;
int
n;
cout<<"Data
BELUM diurutkan : \n";
for(int
ctr=0;ctr<7;ctr++)
{
cout<<setw(3)<<dataku[ctr];
}
cout<<endl<<endl;
do{
adaPertukaran=0;
for(int i=0;i<7-1;i++){
if(dataku[i+1]<dataku[i]){
n=dataku[i];
dataku[i]=dataku[i+1];
dataku[i+1]=n;
adaPertukaran=1;
}
}
}
while(adaPertukaran==1);
cout<<"Data
SETELAH diurutkan : \n";
for(int
i=0;i<7;i++){
cout<<dataku[i];
cout<<"
";
}
_getch();
}
Output :
Sekian pembahasan kita kali ini yaa
Wassalamualaikum Wr. Wb.
Jangan lupa kunjungi link dibawah ini :
Komentar
Posting Komentar