Sabtu, 04 April 2015
Metode Pengurutan Data
1. Pengurutan Berdasarkan Penyisipan dan Penjagaan Terurut (Insert and Keep Sorted Method)
• Insertion Sort
Insertion sort adalah sebuah algoritma pengurutan yang membandingkan dua elemen data pertama, mengurutkannya, kemudian mengecek elemen data berikutnya satu persatu dan membandingkannya dengan elemen data yang telah diurutkan. Karena algoritma ini bekerja
dengan membandingkan elemen-elemen data yang akan diurutkan, algoritma ini termasuk pula dalam comparison-based sort.
Ide dasar dari algoritma Insertion Sort ini adalah mencari tempat yang "tepat" untuk setiap elemen array, dengan cara sequential search. Proses ini
kemudian menyisipkan sebuah elemen array yang diproses ke tempatnya ang seharusnya. Proses dilakukan sebanyak N-1 tahapan (dalam sorting
disebut sebagai "pass"), dengan indeks dimulai dari 0.
Proses pengurutan dengan menggunakan algoritma Insertion Sort dilakukan dengan cara membandingkan data ke-i (dimana i dimulai dari data
ke-2 sampai dengan data terakhir) dengan data berikutnya. Jika ditemukan data yang lebih kecil maka data tersebut disisipkan ke depan sesuai dengan
posisi yang seharusnya.
contoh:
#include
#include
int data[10],data2[10];
int n;
void tukar(int a, int b)
{
int t;
t = data[b];
data[b] = data[a];
data[a] = t;
}
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;
}
}
void main()
{
cout<<" PROGRAM INSERTION SORT"<>n;
for(int i=1;i<=n;i++)
{
cout<<"Masukkan data ke "<>data[i];
data2[i]=data[i];
}
insertion_sort();
cout<<"Data Setelah di Sort : ";
for(i=1; i<=n; i++)
{
cout<<" "<item = itembaru; //baru di tunjuk oleh pointer item & di isi dengan item baru
baru->kiri = NULL; //baru ditunjuk dengan pointer kiri ,dan jika masihh kosong
baru->kanan = NULL; //baru ditunjuk dengan pointer kanan & jika kosong
(*akar) = baru; //pointer akar = variabel baru dengan alamat baru
(*akar)->kiri = NULL;
(*akar)->kanan = NULL;
cout<<"Item bertambah!";
}
else if(itembaru < (*akar)->item) tambah(&(*akar)->kiri,itembaru);
// jika item yang ditambah di kiri
else if(itembaru > (*akar)->item) tambah(&(*akar)->kanan,itembaru); //jika item yang ditambah item ke kanan
else if(itembaru == (*akar)->item) //jika item yang di input sama dengan item yang ditambah sebelumnya
cout<<"Item sudah ada!";
}
void tampil(Node *akar) //fungsi menampilkan seluruh item yang telah di imput
{
if(akar != NULL){
cout<item<<" ";
tampil(akar->kiri), //rekursif dengan fungsi tampil dengan mengarah ke kanan
tampil(akar->kanan); //rekursif dengan fungsi tampil dengan mengarah ke kanan
}}
void preOrder(Node *akar) //fungsi cetak preOrder
{
if(akar != NULL){
cout<< akar->item<<" "; //cetak item akar
preOrder(akar->kiri), //cetak di subtree kiri
preOrder(akar->kanan); //cetak di subtree kanan
}}
void inOrder(Node *akar) //fungsi cetak inOrder
{
if(akar != NULL){
inOrder(akar->kiri), //cetak di subtree kiri
cout<< akar->item<<" "; //cetak item akar
inOrder(akar->kanan); //cetak di subtree kanan
}}
void postOrder(Node *akar) //fungsi cetak postOrder
{
if(akar != NULL){
postOrder(akar->kiri), //cetak di subtree kiri
postOrder(akar->kanan); //cetak di subtree kanan
cout<< akar->item<<" "; //cetak item akar
}}
main()
{
int item;
Node *phn; //pointer phn untuk menghubungkan dengan link Node
phn = NULL; //alamat pointer phn pada NULL
char pil;
do {
system("cls");
cout<<"\tTREE SORT\n";
cout<<"1. Tambah\n";
cout<<"2. Pre-order\n";
cout<<"3. In-order\n";
cout<<"4. Post-order\n";
cout<<"5. Keluar\n";
cout<<"Silahkan masukkan pilihan anda (1-5)... ";
pil=getche();
if(pil=='1')
{
cout<<"\n";
cout<<"\nItem baru : ";cin>>item;
tambah(&phn,item); //fungsi tambah dengan menggunakan alamat pointer phn dengan variabel
}
if(pil=='2')
{
if(phn!=NULL) { //jika phn tidak kosong
cout<< "\n-->Item yang masuk : ";tampil (phn); //cetak item yang masuk
cout<<"\n-->preOrde : ";preOrder(phn); //cetak preOrder
}
else cout<<"\n-->Masih kosong!";
getch();
}
if(pil=='3')
{
if(phn!=NULL) {
cout<< "\n-->Item yang masuk : ";tampil(phn); //cetak item yang masuk
cout<<"\n-->inOrder : ";inOrder (phn); //cetak item inOrder
}
else cout<<"\n-->Masih kosong!";
getch();
}
if(pil=='4')
{
if(phn!=NULL) {
cout<< "\n-->Item yang masuk : ";tampil (phn); //cetak item yang masuk
cout<<"\n-->postOrder : ";postOrder(phn); //cetak item postOrder
}
else cout<<"\n-->Masih kosong!";
getch();
}
}
while(pil!='5');
cout<<"\n";
}
2. Pengurutan Berdasarkan Perbandingan (Comparison Based Sorting)
• Bubble Short
Bubble sort adalah proses pengurutan sederhana yang bekerja dengan cara berulang kali membandingkan dua elemen data pada suatu saat dan menukar elemen data yang urutannya salah. Ide dari Bubble sort adalah gelembung air yang akan "mengapung" untuk table yang terurut menaik (ascending). Elemen bernilai kecil akan "diapungkan" (ke indeks terkecil), artinya diangkat ke "atas" (indeks terkecil) melalui pertukaran. Karena algoritma ini melakukan pengurutan dengan cara membandingkan elemenelemen
data satu sama lain, maka bubble sort termasuk ke dalam jenis algoritma comparison-based sorting.
Proses dalam Bubble sort dilakukan sebanyak N-1 langkah (pass) dengan N adalah ukuran array. Pada akhir setiap langkah ke – I , array L[0..N] akan
terdiri atas dua bagian, yaitu bagian yang sudah terurut L[0..I] dan bagian yang belum terurut L[I+1..N-1]. Setelah langkah terakhir, diperoleh array
L[0..N-1] yang terurut menaik.
contoh:
#include
#include
void main ()
{
int nilai[8];
int temp;
cout<<"Data sebelum diurutkan"<>nilai[ctr];
}
cout<nilai[ii+1])
{
temp=nilai[ii];
nilai[ii]=nilai[ii+1];
nilai[ii+1]=temp;
}
}
}
cout<<"Data setelah diurutkan"<#include
void v_SelAsc(int A[],int N);
void v_Tukar(int *P,int *M);
main()
{ int L[5];
int i,N;
//input data array
printf(“Banyak Data: “);scanf(“%i”,&N);
for(i=0;i=0;k–)
{ maks=0;
for(j=0;j<=k;j++)
{ if (A[j] > A[maks])
{ maks=j; } //endif
} //end loop j
v_Tukar(&A[k],&A[maks]);
} //end loop k
} //end procedure v_SelAsc
void v_Tukar(int *P,int *M)
{ int temp;
temp = *P;
*P = *M;
*M = temp;
} //end procedure v_Tukar
• Heap Sort
Heap Sort mengurutkan dengan memanfaatkan sifat yang dimiliki oleh struktur data heap. Heap adalah suatu strutur data berbentuk pohon biner (binary tree) dimana root dari tree tersebut adalah nilai tertinggi, dan nilai dari parent selalu lebih tinggi dari nilai child.. Ketika suatu array dengan urutan acak ingin dibuat bentuk heapnya, maka diperlukan fungsi untuk pembentukan heapify pada setiap elemen non leaf.
Contoh :
#include
//Fungsi Tukar
void tukar(int &a, int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
//Fungsi Heapify
void heapify(int val[], int l, int r)
{
int temp, idx;
temp = val[r];
idx = r * 2 + 1;
if ((idx < l) && (val[idx] < val[idx+1])) //Note 1
idx++;
while ((idx <= l) && (val[idx] > temp)) //Note 2
{
val[r] = val[idx];
r = idx;
idx = idx * 2 + 1;
if ((idx < l) && (val[idx] < val[idx+1])) //Note 3
idx++;
}
val[r] = temp;
}
//Fungsi Heap Sort
void heapsort(int val[], int n)
{
for (int x = n/2 - 1; x >= 0; x--)
{
heapify(val, n - 1, x);
}
for (int y = n - 1; y > 0; y--)
{
tukar(val[0], val[y]);
heapify(val, y - 1, 0);
}
}
void main()
{
//Deklarasi variabel
int nilai[100];
int z, n;
//Input
cout<<"Jumlah Data : ";
cin>>n;
cout<<"--------------------------------\n";
for(z = 0; z < n; z++)
{
cout<<"Nilai ke-"<<1+z<<" : ";
cin>>nilai[z];
}
//Memanggil fungsi Heap Sort
heapsort(nilai, n);
//Mencetak data setelah diurutkan
cout<<"--------------------------------\n";
cout<<" HEAP SORT \n";
cout<<"--------------------------------\n";
for(z=0; z"
Note 2 = Pengurutan secara ascending menggunakan tanda ">", sedangkan pengurutan secara descending menggunakan tanda "<"
Note 3 = Pengurutan secara ascending menggunakan tanda "<", sedangkan pengurutan secara descending menggunakan tanda ">"
4. Pengurutan Berdasarkan Pembagian dan Penguasaan (Devide and Conquer Method)
• Quick Short
Ide dasar quick sort (pengurutan cepat) yaitu membandingkan hasil setiap perbandingan sebagai penunjuk ke perbandinga berikutnya. Selama perbandingan, kunci dipertukarkan setelah dilengkapi, daftar kemudian dibagi menjadi nilai kunci pada satu partisi (tidak terurut) semuanya kurang dari nilai kunci yang dipilih dan nilai kunci di partisi yang lain semuanya lebih besar dari nilai kunci.
Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi dua bagian, yang belum diurutkan (meja pertama), dan yang telah diurutkan (meja kedua). Elemen pertama yang diambil dari bagian array yang belum diurutkan dan kemudian diletakkan pada posisinya sesuai dengan 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.
void QuickSort(int L, int R)
{
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>data[i];
data2[i] = data[i];
}
}
void Tampil()
{
cout<<“Data : “<
using namespace std;
void merge(int low, int mid, int up);
void mergeSort(int low, int up);
int a[50];
int main()
{
int jumlahBil,i;
cout<<"Masukkan Jumlah element Array"<< endl;
cin>>jumlahBil;
for(int i=0; i>a[i];
}
mergeSort(1,jumlahBil);
for(i=1;i<=jumlahBil;i++)
cout<mid)
{
for(k=j;k<=up;k++){
b[i]=a[k];
i++;
}
}
else
{
for(k=h;k<=mid;k++)
{
b[i]=a[k];
i++;
}
}
for(k=low;k<=up;k++) a[k]=b[k];
}
void mergeSort(int low, int up)
{
int mid;
if(low
Sumber:
ttp://www.dcc-dp.org/berita404-sort-atau-pengurutan-data--di-c--.html
http://puguhjayadi.blogspot.com/2013/05/tree-sort-c.html
http://allaboutalgoritma.blogspot.com/2009/06/metode-pemograman-algoritma-exchange.html
https://thenurulazizah.wordpress.com/artikel-2/13-metode-sorting/
http://zhuelrainz.blogspot.com/2013/05/heap-sort-c_26.html
https://cicink.wordpress.com/2009/06/15/program-sort-komplit-c/
https://7seasons.wordpress.com/tag/merge-sort-c/
http://www.zonaprogram.info/2013/05/contoh-program-mengurutkan-data-dengan.html
Langganan:
Postingan (Atom)