SORTING
TUJUAN BELAJAR:
Setelah melakukan praktikum dalam bab ini, mahasiswa diharapkan mengerti:
1. Beberapa algoritma sorting
2. Mengetahui kelebihan dan kekurangan bermacam-macam algoritma pengurutan data yang ada
3. Memilih algoritma yang paling sesuai untuk menyelesaikan suatu permasalahan pemrograman
TUGAS PENDAHULUAN 1
1. Buatlah algoritma insertion sort
2. Buatlah algoritma selection sort
TUGAS PENDAHULUAN 2
1. Buatlah algoritma bubble sort
2. Buatlah algoritma bubble sort dengan flag
3. Buatlah algoritma shell sort
TUGAS PENDAHULUAN 3
1. Buatlah algoritma Quick sort rekursi
2. Buatlah algoritma Quick sort non rekursi
3. Buatlah algoritma Merge sort
PEMBAHASAN TUGAS PENDAHULUAN 1
1. Algoritma insertion sort
Straight Insertion sort
1. i 1
2. Selama ( i < N ) kerjakan baris 3 sampai dengan 9
3. x Data[i]
4. j i 1
5. Selama ( x < Data[j] ) kerjakan baris 6 dan 7
6. Data[j+1] Data[j]
7. j j -1
8. i i + 1
Binary Insertion sort
1. i 1
2. Selama ( i < N ) kerjakan baris 3 sampai dengan 14
3. x Data[i]
4. l 0
5. r i 1
6. Selama (l<=r) kerjakan baris 7 dan 8
7. m (l+r)/2
8. Jika (x < Data[m]) maka r m l, jika tidak l m +1
9. j i j
10. Selama (j>=1) kerjakan baris 11 dan 12
11. Data[j+1] Data[j]
12. j j - 1
13. Data[l] x
14. i i + 1
2. Algoritma selection sort
1. i 0
2. Selama (i < N-1) kerjakan baris 3 sampai dengan 9
1
3.
4.
5.
6.
7.
8.
9.
ki
ji+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]
ii+1
1. Tumpukan[1].Kiri 0
2. Tumpukan[1].Kanan N -1
3. Selama ujung !=0 kerjakan baris 4 sampai dengan 22
4. L Tumpukan[ujung].Kiri
5. R Tumpukan[ujung].Kanan
6. ujung < ujung 1
7. Selama (R>L) kerjakan baris 8 sampai 22
8. i L
9. j R
10. x Data[(L+R)/2]
11. Selama i<=j kerjakan baris 12 sampai 14
12. Selama (Data[i]<x), i i +1
13. Selama (x<Data[j]), j j -1
14. Jika (i<=j) maka kerjakan baris 15 sampai baris 17, jika tidak ke baris 11
15. Tukar Data[i] dengan Data[j]
16. i < i + 1
17. j < j 1
18. Jika (L<i) kerjakan baris 19 sampai 21
19. ujung ujung +1
20. Tumpukan[ujung].Kiri = i
21. Tumpukan[ujung].Kanan = R
22. R j
3. Algoritma Merge sort
1. i 0
2. j 0
3. J3 0
4. Kerjakan baris 5 sampai dengan 7 selama (i<J1) atau (j<J2)
5. J3 J3 + 1
6. Jika (T1[i] < T2[j]) maka T3[J3] T1[i], i i + 1
7. Jika (T1[i] >= T2[j]) maka T3[J3] T1[j], j j + 1
8. Jika (i>J1) maka kerjakan baris 9, jika tidak kerjakna baris 15
9. i j
10. Selama (i<J2) kerjakan baris 11 sampai 13
11. J3 J3 + 1
12. T3[J3] T2[i]
13. i i + 1
14. Selesai
15. j i
16. Selama (j<J1) kerjakan baris 17 sampai 19
17. J3 < J3 + 1
18. T3[J3] < T1[j]
19. j < j + 1
Jumlah Pembandingan
Jumlah penukaran
1. Source code
//Ascending
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define n 100000
int i,data[n];
int a,s;int b;
void pilihan();
void cetak();
void cetak2();
void tukar();
void straight();
void binary();
void selection();
void bubble();
void quicknon();
void quickrek();
void merge();
void mergeSort();
void m_sort();
void shell();
void main()
{
char lagi;
int pilsort;
do
{
a=0;
system("cls");
4
}
}
}
else if(pildata==5)
{
shell(data,s);
cetak();
}
else if(pildata==6)
{
quicknon();
cetak();
}
else if(pildata==7)
{
quickrek(0,s-1);
cetak();
}
else if(pildata==8)
{
mergeSort(data);
cetak();
}
}
void cetak2()
{
for(i=0;i<s;i++)
printf("[%3d]\t",data[i]);
puts("");
}
void cetak()
{
printf("\n
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",218,196
,196,196,196,196,194,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,1
96,196,196,196,196,196,196,191);
printf("\n %c No %c\t Data urut%8c",179,179,179);
printf("\n
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",195,196
,196,196,196,196,197,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,1
96,196,196,196,196,196,196,180);
for(i=0;i<s;i++)
printf("\n %c%5d%c\t%6d \t%10c",179,i+1,179,data[i],179);
puts("");
printf("
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",192,196
,196,196,196,196,193,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,1
96,196,196,196,196,196,196,217);
printf("\n Banyaknya penukaran data : %d",a);
}
void tukar(int *awal,int *akhir)
6
int sementara;
sementara = *awal;
*awal = *akhir;
*akhir = sementara;
void straight()
{
int j,x;
for (i=1;i<s;i++)
{
x=data[i];
j=i-1;
while(x<data[j])
{
a++;
data[j+1]=data[j];
j--;
}
data[j+1]=x;
}
}
void binary()
{
int j,l,r,m,x;
for(i=1;i<s;i++)
{
x=data[i];
l=0;
r=i-1;
while(l<=r)
{
m=(l+r)/2;
if(x<data[m])
r=m-1;
else
l=m+1;
}
for(j=i-1;j>=l;j--)
data[j+1]=data[j];
data[l]=x;
a++;
}
}
7
void selection()
{
int j, min;
for (i = 0; i < s; i++)
{
min = i;
for (j = i+1; j < s; j++)
{
if (data[j] < data[min])
{
min = j;
}
}
tukar(&data[i], &data[min]);
a++;
}
}
void bubble()
{
int i,j;
for(i=0;i<(s);i++)
{for(j=0;j<(s-(i+1));j++)
if(data[j] > data[j+1])
tukar(&data[j],&data[j+1]);
a++;}
}
void shell(int b[],int s)
{
int j,i,m,tengah;
for(m = s/2;m>0;m/=2)
{
for(j = m;j< s;j++)
{
for(i=j-m;i>=0;i-=m)
{
if(b[i+m]>=b[i])
break;
else
{
tengah = b[i];
b[i] = b[i+m];
b[i+m] = tengah;
}
a++;
}
}
}
}
8
void quicknon()
{
struct tump
{
int kiri;
int kanan;
}tumpukan[15];
int j,l,r,x,ujung=1;
tumpukan[1].kiri=0;
tumpukan[1].kanan=s-1;
while(ujung!=0)
{
l=tumpukan[ujung].kiri;
r=tumpukan[ujung].kanan;
ujung--;
while(r>l)
{
i=l;
j=r;
x=data[(l+r)/2];
while(i<=j)
{
while(data[i]<x)
i++;
while(x<data[j])
j--;
if(i<=j)
{
int sementara;
sementara = data[i];
data[i] = data[j];
data[j] = sementara;
i++;
j--;
}
}
if(l<i)
{
ujung++;
tumpukan[ujung].kiri=i;
tumpukan[ujung].kanan=r;
}
r=j;
a++;
}
}
void merge(int data[], int t[], int kiri, int tengah, int kanan)
10
int i, kiri_2, d, p;
kiri_2 = tengah - 1;
p = kiri;
d = kanan - kiri + 1;
while ((kiri <= kiri_2) && (tengah <= kanan))
{
if (data[kiri] <= data[tengah])
{
t[p] = data[kiri];
p = p + 1;
kiri = kiri +1;
}
else
{
t[p] = data[tengah];
p = p + 1;
tengah = tengah + 1;
}
}
while (kiri <= kiri_2)
{
t[p] = data[kiri];
kiri = kiri + 1;
p = p + 1;
}
while (tengah <= kanan)
{
t[p] = data[tengah];
tengah = tengah + 1;
p = p + 1;
}
11
12
13
2. Source code
//Descending
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define n 100000
int i,data[n];
int a,s;int b;
void pilihan();
void cetak();
void cetak2();
void tukar();
void straight();
void binary();
void selection();
void bubble();
void quicknon();
void quickrek();
void merge();
void mergeSort();
void m_sort();
void shell();
14
void main()
{
char lagi;
int pilsort;
do
{
}
}
a=0;
system("cls");
printf("\n\n ============== CARA SORTING ==============\n");
printf(" 1. Straight Insertion Sort\n");
printf(" 2. Binary Insertion Sort\n");
printf(" 3. Selection Sort\n");
printf(" 4. Bubble Sort\n");
printf(" 5. Shell Sort\n");
printf(" 6. Quick Sort non Rekursif\n");
printf(" 7. Quick Sort Rekursif\n");
printf(" 8. Merge Sort\n");
printf(" ==========================================\n");
printf("\n\n Masukkan banyaknya data : ");
scanf("%d",&s);
printf("\n %c Data awal Random :\n\n",1);
//
srand(time(NULL));
for(i=0;i<s;i++)
data[i]=rand()%1000;
//printf("\t");
cetak2();
puts("");
printf(" %c Pilihan pengurutan : ",1);
scanf("%d",&pilsort);
pilihan(pilsort);
printf("\n Lakukan sorting lagi?(y/t) ");
fflush(stdin);
scanf("%c",&lagi);
while((lagi=='Y')||(lagi=='y'));
selection();
cetak();
}
else if(pildata==4)
{
bubble();
cetak();
}
else if(pildata==5)
{
shell(data,s);
cetak();
}
else if(pildata==6)
{
quicknon();
cetak();
}
else if(pildata==7)
{
quickrek(0,s-1);
cetak();
}
else if(pildata==8)
{
mergeSort(data);
cetak();
}
}
void cetak2()
{
for(i=0;i<s;i++)
printf("[%3d]\t",data[i]);
puts("");
}
void cetak()
{
printf("\n
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
218,196,196,196,196,196,194,196,196,196,196,196,196,196,196,196,196,196,196,196,196,19
6,196,196,196,196,196,196,196,196,196,196,191);
printf("\n %c No %c\t Data urut%8c",179,179,179);
printf("\n
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
195,196,196,196,196,196,197,196,196,196,196,196,196,196,196,196,196,196,196,196,196,19
6,196,196,196,196,196,196,196,196,196,196,180);
for(i=0;i<s;i++)
printf("\n %c%5d%c\t%6d \t%10c",179,i+1,179,data[i],179);
puts("");
16
printf("
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
192,196,196,196,196,196,193,196,196,196,196,196,196,196,196,196,196,196,196,196,196,19
6,196,196,196,196,196,196,196,196,196,196,217);
printf("\n Banyaknya penukaran data : %d",a);
}
void tukar(int *awal,int *akhir)
{
int sementara;
sementara = *awal;
*awal = *akhir;
*akhir = sementara;
}
void straight()
{
int j,x;
for (i=1;i<s;i++)
{
x=data[i];
j=i-1;
while(x<data[j])
{
a++;
data[j+1]=data[j];
j--;
}
data[j+1]=x;
}
}
void binary()
{
int j,l,r,m,x;
for(i=1;i<s;i++)
{
x=data[i];
l=0;
r=i-1;
while(l<=r)
{
m=(l+r)/2;
if(x>data[m])
r=m-1;
else
l=m+1;
17
}
for(j=i-1;j>=l;j--)
data[j+1]=data[j];
data[l]=x;
a++;
void selection()
{
int j, min;
for (i = 0; i < s; i++)
{
min = i;
for (j = i+1; j < s; j++)
{
if (data[j] > data[min])
{
min = j;
}
}
tukar(&data[i], &data[min]);
a++;
}
}
void bubble()
{
int i,j;
for(i=0;i<(s);i++)
{for(j=0;j<(s-(i+1));j++)
if(data[j] < data[j+1])
tukar(&data[j],&data[j+1]);
a++;}
}
void shell(int b[],int s)
{
int j,i,m,mid;
for(m = s/2;m>0;m/=2)
{
for(j = m;j< s;j++)
{
for(i=j-m;i>=0;i-=m)
{
if(b[i+m]<=b[i])
break;
else
{
mid = b[i];
b[i] = b[i+m];
18
b[i+m] = mid;
a++;
void quicknon()
{
struct tump
{
int kiri;
int kanan;
}tumpukan[15];
int j,l,r,x,ujung=1;
tumpukan[1].kiri=0;
tumpukan[1].kanan=s-1;
while(ujung!=0)
{
l=tumpukan[ujung].kiri;
r=tumpukan[ujung].kanan;
ujung--;
while(r>l)
{
i=l;
j=r;
x=data[(l+r)/2];
while(i<=j)
{
while(data[i]>x)
i++;
while(x>data[j])
j--;
if(i<=j)
{
int sementara;
sementara = data[i];
data[i] = data[j];
data[j] = sementara;
i++;
j--;
}
}
if(l<i)
{
ujung++;
tumpukan[ujung].kiri=i;
tumpukan[ujung].kanan=r;
19
}
r=j;
a++;
void merge(int data[], int t[], int kiri, int tengah, int kanan)
{
int i, kiri_2, d, p;
kiri_2 = tengah - 1;
p = kiri;
d = kanan - kiri + 1;
while ((kiri <= kiri_2) && (tengah <= kanan))
{
if (data[kiri] >= data[tengah])
{
t[p] = data[kiri];
p = p + 1;
kiri = kiri +1;
}
else
{
t[p] = data[tengah];
p = p + 1;
tengah = tengah + 1;
}
}
while (kiri <= kiri_2)
{
t[p] = data[kiri];
kiri = kiri + 1;
p = p + 1;
}
while (tengah <= kanan)
{
t[p] = data[tengah];
tengah = tengah + 1;
p = p + 1;
}
21
22
23
3. Source code
//Ascending
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define n 1000000
int i,data[n];
int a,a1,a2,a3,a4,a5,s;int b;
int c,c1,c2,c3,c4,c5;
void pilihan();
void cetak();
void cetak2();
void tukar();
void straight();
void binary();
void selection();
void bubble();
void quicknon();
void shell();
void main()
24
char lagi;
do
{
a=a1=a2=a3=a4=a5=0;
c=c1=c2=c3=c4=c5=0;
system("cls");
printf("\n\n ============== CARA SORTING ==============\n");
printf(" 1. Straight Insertion Sort\n");
printf(" 2. Binary Insertion Sort\n");
printf(" 3. Selection Sort\n");
printf(" 4. Bubble Sort\n");
printf(" 5. Shell Sort\n");
printf(" 6. Quick Sort non Rekursif\n");
printf(" ==========================================\n");
printf("\n\n Masukkan banyaknya data : ");
scanf("%d",&s);
printf("\n %c Data awal Random :\n\n",1);
//
srand(time(NULL));
for(i=0;i<s;i++)
data[i]=rand()%1000;
//printf("\t");
cetak2();
puts("");
cetak();
straight();
printf("\n %cStraight Insertion Sort%c %8d%3c%6d\t%4c",179,179,c,179,a,179);
binary();
printf("\n %cBinary Insertion Sort%3c %8d%3c%6d\t%4c",179,179,c1,179,a1,179);
selection();
printf("\n %cSelection Sort%10c %8d%3c%6d\t%4c",179,179,c2,179,a2,179);
bubble();
printf("\n %cBubble Sort%13c %8d%3c%6d\t%4c",179,179,c3,179,a3,179);
shell(data,s);
printf("\n %cShell Sort%14c %8d%3c%6d\t%4c",179,179,c4,179,a4,179);
quicknon();
printf("\n %cQuick Sort%14c %8d%3c%6d\t%4c",179,179,c5,179,a5,179);
puts("");
printf("
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",192,196,196,196,196,196,196,196,196,196,196,196,196,1
96,196,196,196,196,196,196,196,196,196,196,193,196,196,196,196,196,196,196,196,196,196,196,19
3,196,196,196,196,196,196,196,196,196,196,196,196,196,217);
printf("\n Banyaknya penukaran data : %d",a+a1+a2+a3+a4+a5);
printf("\n Lakukan sorting lagi?(y/t) ");
fflush(stdin);
scanf("%c",&lagi);
}
while((lagi=='Y')||(lagi=='y'));
}
25
void cetak2()
{
for(i=0;i<s;i++)
printf("[%3d]\t",data[i]);
puts("");
}
void cetak()
{
printf("\n
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",218,196,196,196,196,196,196,196,196,196,196,196,196,1
96,196,196,196,196,196,196,196,196,196,196,194,196,196,196,196,196,196,196,196,196,196,196,19
4,196,196,196,196,196,196,196,196,196,196,196,196,196,191);
printf("\n %c\t Metode%9c Banding%3cJumlah Tukar%2c",179,179,179,179);
printf("\n
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",195,196,196,196,196,196,196,196,196,196,196,196,196,1
96,196,196,196,196,196,196,196,196,196,196,197,196,196,196,196,196,196,196,196,196,196,196,19
7,196,196,196,196,196,196,196,196,196,196,196,196,196,180);
}
void tukar(int *awal,int *akhir)
{
int sementara;
sementara = *awal;
*awal = *akhir;
*akhir = sementara;
}
void straight()
{
int j,x;
for (i=1;i<s;i++)
{
c++;
x=data[i];
j=i-1;
while(x<data[j])
{
a++;
data[j+1]=data[j];
j--;
}
data[j+1]=x;
void binary()
{
int j,l,r,m,x;
26
for(i=1;i<s;i++)
{
c1++;
x=data[i];
l=0;
r=i-1;
while(l<=r)
{
a1++;
m=(l+r)/2;
if(x<data[m])
r=m-1;
else
l=m+1;
}
for(j=i-1;j>=l;j--)
data[j+1]=data[j];
data[l]=x;
}
void selection()
{
int j, min;
for (i = 0; i < s; i++)
{
min = i;
for (j = i+1; j < s; j++)
{ c2++;
if (data[j] < data[min])
{
min = j;
}
}
tukar(&data[i], &data[min]);
a2++;
}
}
void bubble()
{
int i,j;
int x=0;
for(i=0;i<s;i++)
{ for(j=0;j<(s-(i+1));j++)
c3++;
{
27
}
}
break;}
}a4=c4+x;
}
void quicknon()
{
struct tump
{
int kiri;
int kanan;
}tumpukan[15];
int j,l,r,x,ujung=1;
tumpukan[1].kiri=0;
tumpukan[1].kanan=s-1;
28
while(ujung!=0)
{c5++;
l=tumpukan[ujung].kiri;
r=tumpukan[ujung].kanan;
ujung--;
while(r>l)
{
i=l;
j=r;
x=data[(l+r)/2];
while(i<=j)
{
}
if(l<i)
{
}
r=j;
while(data[i]<x)
i++;
while(x<data[j])
j--;
if(i<=j)
{
int sementara;a5++;
sementara = data[i];
data[i] = data[j];
data[j] = sementara;
i++;
j--;
}
ujung++;
tumpukan[ujung].kiri=i;
tumpukan[ujung].kanan=r;
29
30