Anda di halaman 1dari 20

M11 – Bubble dan Shell Sort

ALGORITMA DAN STRUKTUR DATA

Nama : Habil
Kelas : 1 D4 Teknik Informatika B
NRP : 3120600055

PROGRAM STUDI TEKNIK INFORMATIKA


DEPARTEMEN TEKNIK INFORMATIKA dan KOMPUTER

POLITEKNIK ELEKTRONIKA NEGERI SURABAYA


2020/2021
1. A. Implementasikan algoritma metode
a. BUBBLE SORT
b. SHELL SORT
dengan data array of int berjumlah 10 elemen. Elemen dalam array tidak diinputkan, namun
diinisialisasi di awal. Tampilkan hasil per iterasi dan lakukan pengurutan secara ascending.

B. Tambahkan perhitungan total jumlah pembandingan (comparison = C), jumlah


penukaran (swapping = S) dan jumlah pergeseran (movement = M) pada setiap fungsi
pengurutan data yang sudah dibuat dan tampilkan nilai C, S dan M untuk setiap metode.

Listing Code
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int n=10;
void bubble_sort(int[],int n);
void shell_sort(int[],int n);
void tampil(int[],int n);

int main()
{
while(1)
{
int bilangan[10] = {0,18,6,26,19,15,11,29,26,24};
int opt;
printf("Menu Sorting\n");
printf("1. Bubble Sort\n");
printf("2. Shell Sort\n");
printf("3. Keluar\n");
printf("Pilihan anda = ");
scanf("%d",&opt);
switch(opt)
{
case 1:
tampil(bilangan,n);
bubble_sort(bilangan,n);
tampil(bilangan,n);
puts(" ");
break;
case 2:
tampil(bilangan,n);
shell_sort(bilangan,n);
tampil(bilangan,n);
puts(" ");
break;
default:
exit(0);
}
}
return 0;
}

void bubble_sort(int a[n],int n)


{
bool tertukar;
int i,j,tukar,C,S,M;
C=0;
S=0;
M=0;
tertukar = true;
for(i=0;i<n;i++){
if(tertukar==true){
tertukar=false;
for(j=0;j<n-i-1;j++){
C++;
M++;
if(a[j]>a[j+1]){
tukar=a[j];
a[j]=a[j+1];
a[j+1]=tukar;
tertukar=true;
S++;
M+=3;
tampil(a,n);
}
}
}
}
printf("Nilai perbandingannya adalah %d\n",C);
printf("Nilai penukaran adalah %d\n",S);
printf("Nilai pergeseran adalah %d\n",M);
}

void shell_sort(int a[n],int n)


{
int jarak,i,tukar,C,S,M;
bool tertukar;
jarak=n;
C=0;
S=0;
M=0;
while(jarak>1){
jarak = jarak/2;
tertukar=true;
printf("K = %d\n",jarak);
while(tertukar==true){
tertukar=false;
i=0;
while(i<n-jarak){
C++;
M++;
if(a[i]>a[i+jarak]){
tukar=a[i];
a[i]=a[i+jarak];
a[i+jarak]=tukar;
tertukar=true;
tampil(a,n);
S++;
M+=3;
}
i++;
}
}
}
printf("Nilai perbandingannya adalah %d\n",C);
printf("Nilai penukaran adalah %d\n",S);
printf("Nilai pergeseran adalah %d\n",M);
}

void tampil(int a[n],int n)


{
int i;
for(i=0;i<=n-1;i++){
printf("%d ",a[i]);
}
puts(" ");
}

Output
2. Buatlah fungsi untuk generate bilangan random. Modifikasi program nomor 1 untuk
mengurutkan data dengan jumlah elemen >= 20000 yang digenerate secara random.
Tambahkan perhitungan waktu komputasinya. Tambahkan fungsi mode_urut() untuk
memilih menu pengurutan secara ascending ataukah descending. Buatlah fungsi
generate_random() untuk mengenerate sejumlah bilangan random. Gunakan header math.h
fungsi rand() dan srand().
Listing Code
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include <time.h>
int n=100000;
void bubble_sort(int[],int n);
void shell_sort(int[],int n);
void tampil(int[],int n);
void generate(int[]);
void copy_arr(int[],int[]);
int modeUrut();
time_t t1,t2;
long int waktukomputasi;

int main()
{
int A[n],B[n];
printf("Isi berapa data ? ");
scanf("%d",&n);
srand(time(NULL));
generate(A);
tampil(A,n);
copy_arr(A,B);
while(1)
{
copy_arr(B,A);
int opt;
printf("Menu Sorting\n");
printf("1. Bubble Sort\n");
printf("2. Shell Sort\n");
printf("3. Keluar\n");
printf("Pilihan anda = ");
scanf("%d",&opt);
switch(opt)
{
case 1:
time(&t1);
bubble_sort(A,n);
time(&t2);
waktukomputasi=t2-t1;
tampil(A,n);
printf("Durasinya adalah %ld\n",waktukomputasi);
puts(" ");
break;
case 2:
time(&t1);
shell_sort(A,n);
time(&t2);
waktukomputasi=t2-t1;
tampil(A,n);
printf("Durasinya adalah %ld\n",waktukomputasi);
puts(" ");
break;
default:
exit(0);
}
}
return 0;
}

void bubble_sort(int a[n],int n)


{
bool tertukar;
int i,j,tukar,C,S,M;
C=0;
S=0;
M=0;
tertukar = true;
if(modeUrut()==1){
for(i=0;i<=n-1;i++){
if(tertukar==true){
tertukar=false;
for(j=0;j<=n-i-1;j++){
C++;
M++;
if(a[j]>a[j+1]){
tukar=a[j];
a[j]=a[j+1];
a[j+1]=tukar;
tertukar=true;
S++;
M+=3;
}
}
}
}
printf("Nilai perbandingannya adalah %d\n",C);
printf("Nilai penukaran adalah %d\n",S);
printf("Nilai pergeseran adalah %d\n",M);
}else{
for(i=0;i<=n-1;i++){
if(tertukar==true){
tertukar=false;
for(j=0;j<n-i-1;j++){
C++;
M++;
if(a[j]<a[j+1]){
tukar=a[j];
a[j]=a[j+1];
a[j+1]=tukar;
tertukar=true;
S++;
M+=3;
}
}
}
}
printf("Nilai perbandingannya adalah %d\n",C);
printf("Nilai penukaran adalah %d\n",S);
printf("Nilai pergeseran adalah %d\n",M);
}
}

void shell_sort(int a[n],int n)


{
int jarak,i,tukar,C,S,M;
bool tertukar;
jarak=n;
C=0;
S=0;
M=0;
if(modeUrut()==1){
while(jarak>1){
jarak = jarak/2;
tertukar=true;
while(tertukar==true){
tertukar=false;
i=0;
while(i<n-jarak){
C++;
M++;
if(a[i]>a[i+jarak]){
tukar=a[i];
a[i]=a[i+jarak];
a[i+jarak]=tukar;
tertukar=true;
S++;
M+=3;
}
i++;
}
}
}
printf("Nilai perbandingannya adalah %d\n",C);
printf("Nilai penukaran adalah %d\n",S);
printf("Nilai pergeseran adalah %d\n",M);
}else{
while(jarak>1){
jarak = jarak/2;
tertukar=true;
while(tertukar==true){
tertukar=false;
i=0;
while(i<n-jarak){
C++;
M++;
if(a[i]<a[i+jarak]){
tukar=a[i];
a[i]=a[i+jarak];
a[i+jarak]=tukar;
tertukar=true;
S++;
M+=3;
}
C++;
i++;
}
}
}
printf("Nilai perbandingannya adalah %d\n",C);
printf("Nilai penukaran adalah %d\n",S);
printf("Nilai pergeseran adalah %d\n",M);
}
}

void tampil(int a[n],int n)


{
int i;
for(i=0;i<=n-1;i++){
printf("%d ",a[i]);
}
puts(" ");
}

void generate(int a[n])


{
int i;

for(int i=0; i<n; i++){


a[i]=rand()/1000;
}
}

void copy_arr(int a[n],int b[n])


{
int i;

for(i=0;i<n;i++){
b[i]=a[i];
}
}

int modeUrut()
{
int opt;
printf("\nPengurutan yang dipilih\n");
printf("1. Ascending\n");
printf("2. Descending\n");
printf("Pilihan anda ? ");
scanf("%d",&opt);
if(opt==1){
return 1;
}else{
return 2;
}
}

Output
Bubble-Ascending

Bubble-Descending

Shell-Asccending
Shell-Descending
3. Tambahkan 2 metode ini ke dalam program menu yang telah dibuat sebelumnya (Insertion
dan Selection short). Untuk semua metode:
Inisialisasi elemen array awal menggunakan fungsi generate random variabel dan juga
menampilkan waktu eksekusi.
Tanpa menampilkan perhitungan total jumlah pembandingan (comparison = C), jumlah
penukaran (swapping = S) dan jumlah pergeseran (movement = M).

Listing Code
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include <time.h>
int n=100000;
void bubble_sort(int[],int n);
void shell_sort(int[],int n);
void insertion_sort(int[],int n);
void selection_sort(int[],int n);
void tampil(int[],int n);
void generate(int[]);
void copy_arr(int[],int[]);
int modeUrut();
time_t t1,t2;
long int waktukomputasi;
int main()
{
int A[n],B[n];
printf("Isi berapa data ? ");
scanf("%d",&n);
srand(time(NULL));
generate(A);
copy_arr(A,B);
while(1)
{
copy_arr(B,A);
int opt;
printf("Menu Sorting\n");
printf("1. Bubble Sort\n");
printf("2. Shell Sort\n");
printf("3. Insertion Sort\n");
printf("4. Selection Sort\n");
printf("5. Keluar\n");
printf("Pilihan anda = ");
scanf("%d",&opt);
switch(opt)
{
case 1:
time(&t1);
bubble_sort(A,n);
time(&t2);
waktukomputasi=t2-t1;
printf("Durasinya adalah %ld\n",waktukomputasi);
puts(" ");
break;
case 2:
time(&t1);
shell_sort(A,n);
time(&t2);
waktukomputasi=t2-t1;
printf("Durasinya adalah %ld\n",waktukomputasi);
puts(" ");
break;
case 3:
time(&t1);
insertion_sort(A,n);
time(&t2);
waktukomputasi=t2-t1;
printf("Durasinya adalah %ld\n",waktukomputasi);
puts(" ");
break;
case 4:
time(&t1);
selection_sort(A,n);
time(&t2);
waktukomputasi=t2-t1;
printf("Durasinya adalah %ld\n",waktukomputasi);
puts(" ");
break;
default:
exit(0);
}
}
return 0;
}

void bubble_sort(int a[n],int n)


{
bool tertukar;
int i,j,tukar;
tertukar = true;
if(modeUrut()==1){
for(i=0;i<=n-1;i++){
if(tertukar==true){
tertukar=false;
for(j=0;j<=n-i-1;j++){
if(a[j]>a[j+1]){
tukar=a[j];
a[j]=a[j+1];
a[j+1]=tukar;
tertukar=true;
}
}
}
}
}else{
for(i=0;i<=n-1;i++){
if(tertukar==true){
tertukar=false;
for(j=0;j<n-i-1;j++){
sleep(2);
if(a[j]<a[j+1]){
tukar=a[j];
a[j]=a[j+1];
a[j+1]=tukar;
tertukar=true;
}
}
}
}
}
}

void shell_sort(int a[n],int n)


{
int jarak,i,tukar;
bool tertukar;
jarak=n;
if(modeUrut()==1){
while(jarak>1){
jarak = jarak/2;
tertukar=true;
while(tertukar==true){
tertukar=false;
i=0;
while(i<n-jarak){
sleep(2);
if(a[i]>a[i+jarak]){
tukar=a[i];
a[i]=a[i+jarak];
a[i+jarak]=tukar;
tertukar=true;
}
i++;
}
}
}
}else{
while(jarak>1){
jarak = jarak/2;
tertukar=true;
while(tertukar==true){
tertukar=false;
i=0;
while(i<n-jarak){
sleep(2);
if(a[i]<a[i+jarak]){
tukar=a[i];
a[i]=a[i+jarak];
a[i+jarak]=tukar;
tertukar=true;
}
i++;
}
}
}
}
}

void insertion_sort(int a[n],int n)


{
int key,j,i;
if(modeUrut()==1){
for(i=1;i<n;i++){
key = a[i];
j=i-1;
while((j>=0) && (a[j]>key)){
sleep(2);
a[j+1]=a[j];
j=j-1;
}
a[j+1]=key;
}
}else{
for(i=1;i<n;i++){
key = a[i];
j=i-1;
while((j>=0) && (a[j]<key)){
sleep(2);
a[j+1]=a[j];
j=j-1;
}
a[j+1]=key;
}
}
}

void selection_sort(int a[n],int n)


{
int temp,j,min,i;
if(modeUrut()==1){
for(i=0;i<n;i++){
min=i;
for(j=i+1;j<n;j++){
if(a[j]<a[min]){
min=j;
}
}
sleep(2);
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}else{
for(i=0;i<n;i++){
min=i;
for(j=i+1;j<n;j++){
if(a[j]>a[min]){
min=j;
}
}
sleep(2);
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
}

void tampil(int a[n],int n)


{
int i;
for(i=0;i<=n-1;i++){
printf("%d ",a[i]);
}
puts(" ");
}

void generate(int a[n])


{
int i;

for(int i=0; i<n; i++){


a[i]=rand()/1000;
}
}

void copy_arr(int a[n],int b[n])


{
int i;

for(i=0;i<n;i++){
b[i]=a[i];
}
}

int modeUrut()
{
int opt;
printf("\nPengurutan yang dipilih\n");
printf("1. Ascending\n");
printf("2. Descending\n");
printf("Pilihan anda ? ");
scanf("%d",&opt);
if(opt==1){
return 1;
}else{
return 2;
}
}
Output

Anda mungkin juga menyukai