Listing Program Sorting

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 12

Listing Program

#include<stdio.h>
#include<string.h>
#define MAX 30
typedef struct siswa{
int NO;
char Nama[20];
char Alm[50];
char Nilai;
}Sort;
Sort Data[MAX],PEN[MAX];
int x,M,C,swap,tamp,tampU;
void isi();
void tukar(Sort *,Sort *);
void sisip(int ,int );
void seleksi(int ,int );
int mode_urut();
int dasar_urut();
void buble(int ,int );
void shell(int ,int );
void arraycopy();
void Quick(int ,int );
int partition(int ,int );
void Merges(int ,int );
void Merge(int ,int ,int );
main()
{
int chose,i,p;
isi();
fflush(stdin);
do
{
C=0;M=0;swap=0;p=0;
printf("\n");
printf("MENU METODE SORTING\n");
printf("1. Isertion Sort\n");
printf("2. Selection Sort\n");
printf("3. Buble Sort\n");
printf("4. Shell Sort\n");
printf("5. Quick Sort\n");
printf("6. Merge Sort\n");
printf("7. Keluar\n");
printf("Masukkan pilihan metode (1/7) : ");scanf("%d",&chose);
if(chose>=1 && chose<=6)
{
tampU=dasar_urut();
tamp=mode_urut();
arraycopy();
}
switch(chose)
{
case 1:
sisip(tamp,tampU);
break;
case 2:
seleksi(tamp,tampU);
break;
case 3:
buble(tamp,tampU);
break;
case 4:
shell(tamp,tampU);
break;
case 5:
Quick(p,x-1);
break;
case 6:

Merges(p,x-1);
break;
default :
printf("Pilihan metode salah!!!\n");
break;
}
if(chose>=1 && chose<=6)
{
printf("\nData yang sudah diurutkan :\n");
for(i=0;i<x;i++)
{
printf("\nData ke-%d\n",i+1);
printf("No.
: %d\n",PEN[i].NO);
printf("Nama
: %s\n",PEN[i].Nama);
printf("Alamat : %s\n",PEN[i].Alm);
printf("Nilai : %c\n\n",PEN[i].Nilai);
}
if(chose>=2 && chose<=6)
printf("Swap
: %d kali\n",swap);
printf("Compare(C) : %d kali\n",C);
printf("Movement(M) : %d kali\n",M);
}
}while(chose!=7);
}
void isi()
{
int i;
printf("Jumlah data yang ingin dimasukkan : ");scanf("%d",&x);
for(i=0;i<x;i++)
{
printf("\n");
printf("Data ke-%d\n",i+1);
printf("No.
: ");scanf("%d",&Data[i].NO);
fflush(stdin);
printf("Nama
: ");scanf("%s",Data[i].Nama);
fflush(stdin);
printf("Alamat : ");scanf("%s",Data[i].Alm);
fflush(stdin);
printf("Nilai : ");scanf("%c",&Data[i].Nilai);
fflush(stdin);
}
}
void arraycopy()
{
int i;
for(i=0;i<x;i++)
PEN[i]=Data[i];
}
void sisip(int pung,int tampU)
{
int i,j,kond;
Sort key;
for(i=1;i<x;i++)
{
key=Data[i];
j=i-1;
while(j>=0)
{
if(pung==1)
{
switch(tampU)
{
case 1:
kond=PEN[j].NO > key.NO;
break;
case 2:

kond=strcmpi(PEN[j].Nama,key.Nama)>0;
break;
case 3:
kond=PEN[j].Nilai > key.Nilai;
break;
}
}
else
{
switch(tampU)
{
case 1:
kond=kond=PEN[j].NO < key.NO;
break;
case 2:
kond=strcmpi(PEN[j].Nama,key.Nama)<0;
break;
case 3:
kond=PEN[j].Nilai < key.Nilai;
break;
}
}
C++;
if(kond)
{
PEN[j+1]=PEN[j];
M++;
j=j-1;
}
PEN[j+1]=key;
M++;
if(j>=0 && kond!=1)
break;
}
}
}
void seleksi(int pung,int tampU)
{
int i,j,min,kond;
for(i=0;i<x-1;i++)
{
min=i;
j=i+1;
while(j<x)
{
if(pung==1)
{
switch(tampU)
{
case 1:
kond=PEN[j].NO < PEN[min].NO;
break;
case 2:
kond=strcmpi(PEN[j].Nama,PEN[min].Nama)<0;
break;
case 3:
kond=PEN[j].Nilai < PEN[min].Nilai;
break;
}
}
else
{
switch(tampU)
{
case 1:
kond=PEN[j].NO > PEN[min].NO;
break;
case 2:
kond=strcmpi(PEN[j].Nama,PEN[min].Nama)>0;
break;
case 3:
kond=PEN[j].Nilai > PEN[min].Nilai;

break;
}
}
if(kond)
min=j;
j=j+1;
C++;
}
tukar(&PEN[i],&PEN[min]);
swap++;
M=M+3;
}
}
void tukar(Sort *x,Sort *y)
{
Sort temp;
temp = *x;
*x = *y;
*y = temp;
}
int mode_urut()
{
int pil;
do
{
printf("\n");
printf("MODE URUT\n");
printf("1. Ascending Mode\n");
printf("2. Descending Mode\n");
printf("Masukkan pilihan metode (1/2) : ");scanf("%d",&pil);
if(pil!=1 && pil!=2)
printf("Pilihan anda salah!!\n");
}while(pil!=1&&pil!=2);
return pil;
}
int dasar_urut()
{
int ops;
do
{
printf("\n");
printf("PENGURUTAN BERDASARKAN :\n");
printf("1. Nomor\n");
printf("2. Nama\n");
printf("3. Nilai\n");
printf("Mode pengurutan berdasarkan : ");scanf("%d",&ops);
}while(ops<1 && ops >3);
return ops;
}
void buble(int pung,int tampU)
{
int did_swap,i,pos_ahir,kond;
did_swap=1;
pos_ahir=x-2;
while(pos_ahir >=0 && did_swap==1)
{
did_swap=0;
for(i=0;i<=pos_ahir;i++)
{
if(pung==1)
{
switch(tampU)
{

case 1:
kond=PEN[i].NO > PEN[i+1].NO;
break;
case 2:
kond=strcmpi(PEN[i].Nama,PEN[i+1].Nama)>0;
break;
case 3:
kond=PEN[i].Nilai > PEN[i+1].Nilai;
break;
}
}
else
{
switch(tampU)
{
case 1:
kond=PEN[i].NO < PEN[i+1].NO;
break;
case 2:
kond=strcmpi(PEN[i].Nama,PEN[i+1].Nama)<0;
break;
case 3:
kond=PEN[i].Nilai < PEN[i+1].Nilai;
break;
}
}
C++;
if(kond)
{
tukar(&PEN[i],&PEN[i+1]);
did_swap=1;
M=M+3;
swap++;
}
}
pos_ahir--;
}
}
void shell(int pung,int tampU)
{
int dowo,did_swap,i,kond;
for(dowo=x;dowo>=1;dowo=dowo/2)
{
did_swap=1;
while(did_swap==1)
{
did_swap=0;
for(i=0;i<x-dowo;i++)
{
if(pung==1)
{
switch(tampU)
{
case 1:
kond=PEN[i].NO > PEN[i+1].NO;
break;
case 2:
kond=strcmpi(PEN[i].Nama,PEN[i+1].Nama)>0;
break;
case 3:
kond=PEN[i].Nilai > PEN[i+1].Nilai;
break;
}
}
else
{
switch(tampU)
{
case 1:
kond=PEN[i].NO < PEN[i+1].NO;
break;
case 2:

kond=strcmpi(PEN[i].Nama,PEN[i+1].Nama)<0;
break;
case 3:
kond=PEN[i].Nilai <PEN[i+1].Nilai;
break;
}
}
C++;
if(kond)
{
tukar(&PEN[i],&PEN[i+dowo]);
did_swap=1;
M=M+3;
swap++;
}
}
}
}
}
void Quick(int p,int r)
{
int q;
if(p < r)
{
q=partition(p,r);
Quick(p,q);
Quick(q+1,r);
}
}
int partition(int p,int r)
{
Sort x;
int i,j,kond1,kond2;
x=PEN[p];
i=p-1;
j=r+1;
do
{
if(tampU==1)
{
do
{
switch(tamp)
{
case 1:
kond1=PEN[j].NO > x.NO;
break;
case 2:
kond1=strcmpi(PEN[j].Nama,x.Nama)>0;
break;
case 3:
kond1=PEN[j].Nilai > x.Nilai;
break;
}
if(kond1)
j--;
C++;
}while(kond1);
do
{
switch(tamp)
{
case 1:
kond2=PEN[i].NO < x.NO;
break;
case 2:
kond2=strcmpi(PEN[i].Nama,x.Nama)<0;
break;
case 3:

kond2=PEN[i].Nilai < x.Nilai;


break;
}
if(kond2)
i++;
C++;
}while(kond2);
}
else
{
do
{
switch(tamp)
{
case 1:
kond1=PEN[j].NO < x.NO;
break;
case 2:
kond1=strcmpi(PEN[j].Nama,x.Nama)<0;
break;
case 3:
kond1=PEN[j].Nilai < x.Nilai;
break;
}if(kond1)
j--;
C++;
}while(kond1);
do
{
switch(tamp)
{
case 1:
kond2=PEN[i].NO > x.NO;
break;
case 2:
kond2=strcmpi(PEN[i].Nama,x.Nama)>0;
break;
case 3:
kond2=PEN[i].Nilai > x.Nilai;
break;
}
if(kond2)
i++;
C++;
}while(kond2);
}
if(i<j)
{
tukar(&PEN[i],&PEN[j]);
j--;
i++;
swap++;
M=M+3;
}
else
return j;
}while(i<=j);
}
void Merge(int left,int med,int right)
{
Sort result[MAX];
int ka1,ki1,ka2,ki2,kond,i,j;
ki1=left;
ka1=med;
ki2=med+1;
ka2=right;
i=left;
while(ki1<=ka1 && ki2<=ka2)

{
if(tampU==1)
{
switch(tamp)
{
case 1:
kond=PEN[ki1].NO < PEN[ki2].NO;
break;
case 2:
kond=strcmpi(PEN[ki1].Nama,PEN[ki2].Nama)<0;
break;
case 3:
kond=PEN[ki1].Nilai < PEN[ki2].Nilai;
break;
}
}
else
{
switch(tamp)
{
case 1:
kond=PEN[ki1].NO > PEN[ki2].NO;
break;
case 2:
kond=strcmpi(PEN[ki1].Nama,PEN[ki2].Nama)>0;
break;
case 3:
kond=PEN[ki1].Nilai > PEN[ki2].Nilai;
break;
}
}C++;
if(kond)
{
result[i]=PEN[ki1];
ki1++;
}
else
{
result[i]=PEN[ki2];
ki2++;
}i++;
}
while(ki1<=ka1)
{
result[i]=PEN[ki1];
ki1++;
i++;
}
while(ki2<=ka2)
{
result[i]=PEN[ki2];
ki2++;
i++;
}
for(j=left;j<=right;j++)
PEN[j]=result[j];
}

void Merges(int l,int r)


{
int med;
if(l<r)
{
med=(l+r)/2;
Merges(l,med);
Merges(med+1,r);
Merge(l,med,r);
}
}

Contoh Output
Jumlah data yang ingin dimasukkan : 3
Data ke-1
No.
: 3
Nama
: aa
Alamat : aaa
Nilai : b
Data ke-2
No.
: 1
Nama
: bb
Alamat : bbb
Nilai : c
Data ke-3
No.
: 2
Nama
: cc
Alamat : ccc
Nilai : a
MENU METODE SORTING
1. Isertion Sort
2. Selection Sort
3. Buble Sort
4. Shell Sort
5. Quick Sort
6. Merge Sort
7. Keluar
Masukkan pilihan metode (1/7) : 5
PENGURUTAN BERDASARKAN :
1. Nomor
2. Nama
3. Nilai
Mode pengurutan berdasarkan : 1
MODE URUT
1. Ascending Mode
2. Descending Mode
Masukkan pilihan metode (1/2) : 1
Data yang sudah diurutkan :
Data ke-1
No.
: 1
Nama
: bb
Alamat : bbb
Nilai : c
Data ke-2
No.
: 2
Nama
: cc
Alamat : ccc
Nilai : a
Data ke-3
No.
: 3
Nama
: aa
Alamat : aaa

Nilai

: b

Swap
: 2 kali
Compare(C) : 10 kali
Movement(M) : 6 kali
MENU METODE SORTING
1. Isertion Sort
2. Selection Sort
3. Buble Sort
4. Shell Sort
5. Quick Sort
6. Merge Sort
7. Keluar
Masukkan pilihan metode (1/7) : 5
PENGURUTAN BERDASARKAN :
1. Nomor
2. Nama
3. Nilai
Mode pengurutan berdasarkan : 1
MODE URUT
1. Ascending Mode
2. Descending Mode
Masukkan pilihan metode (1/2) : 2
Data yang sudah diurutkan :
Data ke-1
No.
: 3
Nama
: aa
Alamat : aaa
Nilai : b
Data ke-2
No.
: 2
Nama
: cc
Alamat : ccc
Nilai : a
Data ke-3
No.
: 1
Nama
: bb
Alamat : bbb
Nilai : c
Swap
: 0 kali
Compare(C) : 7 kali
Movement(M) : 0 kali
MENU METODE SORTING
1. Isertion Sort
2. Selection Sort
3. Buble Sort
4. Shell Sort
5. Quick Sort
6. Merge Sort
7. Keluar
Masukkan pilihan metode (1/7) : 6
PENGURUTAN BERDASARKAN :
1. Nomor
2. Nama
3. Nilai
Mode pengurutan berdasarkan : 1

MODE URUT
1. Ascending Mode
2. Descending Mode
Masukkan pilihan metode (1/2) : 1
Data yang sudah diurutkan :
Data ke-1
No.
: 1
Nama
: bb
Alamat : bbb
Nilai : c
Data ke-2
No.
: 2
Nama
: cc
Alamat : ccc
Nilai : a
Data ke-3
No.
: 3
Nama
: aa
Alamat : aaa
Nilai : b
Swap
: 0 kali
Compare(C) : 3 kali
Movement(M) : 0 kali
MENU METODE SORTING
1. Isertion Sort
2. Selection Sort
3. Buble Sort
4. Shell Sort
5. Quick Sort
6. Merge Sort
7. Keluar
Masukkan pilihan metode (1/7) : 6
PENGURUTAN BERDASARKAN :
1. Nomor
2. Nama
3. Nilai
Mode pengurutan berdasarkan : 1
MODE URUT
1. Ascending Mode
2. Descending Mode
Masukkan pilihan metode (1/2) : 2
Data yang sudah diurutkan :
Data ke-1
No.
: 3
Nama
: aa
Alamat : aaa
Nilai : b
Data ke-2
No.
: 2
Nama
: cc
Alamat : ccc
Nilai : a
Data ke-3
No.
: 1
Nama
: bb
Alamat : bbb
Nilai : c
Swap
: 0 kali
Compare(C) : 3 kali
Movement(M) : 0 kali

MENU METODE SORTING


1. Isertion Sort
2. Selection Sort
3. Buble Sort
4. Shell Sort
5. Quick Sort
6. Merge Sort
7. Keluar
Masukkan pilihan metode (1/7) : 7
Pilihan metode salah!!!
Press any key to continue

You might also like