Metode Sorting
Metode Sorting
Seringkali perancang program perlu mengurutkan sekumpulan data yang dimiliki untuk memudahkan
pemrosesan selanjutnya terhadap data tersebut. Pengurutan adalah sebuah algoritma dasar yang
sering diperlukan dalam pembuatan program. Berbagai algoritma pengurutan telah diciptakan dan
dapat digunakan. Pemahaman tentang beberapa algoritma pengurutan dasar perlu diketahui,
termasuk cara penggunaannya dalam program.
PENGERTIAN SORT
Sorting atau pengurutan data adalah proses yang sering harus dilakukan dalam pengolahan
data. Sortdalam hal ini diartikan mengurutkan data yang berada dalam suatu tempat penyimpanan,
dengan urutan tertentu baik urut menaik (ascending) dari nilai terkecil sampai dengan nilai terbesar,
atau urut menurun (descending) dari nilai terbesar sampai dengan nilai terkecil. Sorting adalah
proses pengurutan.
Pengurutan internal (internal sort), yaitu pengurutan terhadap sekumpulan data yang
disimpan dalam media internal komputer yang dapat diakses setiap elemennya secara langsung.
Dapat dikatakan sebagai pengurutan tabel
Pengurutan eksternal (external sort), yaitu pengurutan data yang disimpan dalam memori
sekunder, biasanya data bervolume besar sehingga tidak mampu untuk dimuat semuanya dalam
memori.
Dalam courseware ini, hanya akan dibahas algoritma pengurutan internal, dengan data berada
dalam arraysatu dimensi.
1.Bubble Sort
2.Selection Sort
3.Insertion Sort
4.Shell Sort
5.Merge Sort
6.Radix Sort
7.Quick Sort
8.Heap Sort
Dalam courseware ini hanya akan dibahas tiga metode sort yang pertama yang dianggap mudah,
yaitu: Bubble Sort , Selection Sort dan Insertion Sort
algoritma ini melakukan pengurutan dengan cara membandingkan elemen-elemen 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.
0 terurut
Untuk mendapatkan urutan yang menaik, algoritmanya dapat ditulis secara global sebagai berikut :
Pass 1: I = 0. Mulai dari elemen J = N-1,N–2,…,1, bandingkan L[J-1] dengan L[J]. Jika L[J-1] >
L[J], pertukarkan L[J-1] dengan L[J]. Pada akhir langkah 1, elemen L[0] berisi harga minimum
pertama.
Pass 2: I = 1. Mulai dari elemen J = N-1,N–2,…,2, bandingkan L[J-1] dengan L[J]. Jika L[J-1] >
L[J], pertukarkan L[J-1] dengan L[J]. Pada akhir langkah 2, elemen L[1] berisi harga minimum kedua
dan array L[0..1] terurut, sedangkan L[2..(N-1)] belum terurut.
Pass 3: I = 2. Mulai dari elemen J = N-1,N–2,…,3, bandingkan L[J-1] dengan L[J]. Jika L[J-1] >
L[J], pertukarkan L[J-1] dengan L[J]. Pada akhir langkah 3, elemen L[2] berisi harga minimum ketiga
dan array L[0..2] terurut, sedangkan L[3..(N-1)] belum terurut.
………
Pass N-1: Mulai dari elemen J = N-1, bandingkan L[J-1] dengan L[J]. Jika L[J-1] > L[J], pertukarkan
L[J-1] dengan L[J].
Pada akhir langkah N-2, elemen L[N-2] berisi nilai minimun ke [N-2] dan array L[0..N-2] terurut
menaik (elemen yang tersisa adalah L[N-1], tidak perlu diurut karena hanya satu-satunya).
Misal array L dengan N = 5 buah elemen yang belum terurut. Array akan diurutkan
secara ascending(menaik).
8 9 7 6 1
0 1 2 3 4
Pass 1 :
I = 0 ;J= N-1= 4 8 9 7 1 6
J=3 8 9 1 7 6
J=2 8 1 9 7 6
J=1 1 8 9 7 6
Hasil akhir langkah 1 :
8 9 7 6
1
0 1 2 3 4
Pass 2 :
I = 1 ;J= N-1= 4 1 8 9 6 7
J=3 1 8 6 9 7
J=2 1 6 8 9 7
Hasil akhir langkah 2 :
8 9 7
1 6
0 1 2 3 4
Pass 3 :
I = 2 ;J= N-1= 4 1 6 8 7 9
J=3 1 6 7 8 9
Hasil akhir langkah 3 :
8 9
1 6 7
0 1 2 3 4
Pass 4 :
I = 3 ;J= N-1= 4 1 6 7 8 9
Hasil akhir langkah 4 :
1 6 7 8 9
0 1 2 3 4
7. ALGORITMA:8. for(i=0;i<=(N-2);i++)
9. for(j=(N-1);j>=(i+1);j–)
10. if (A[j-1]>A[j])
11. tempßA[j-1]
12. A[j-1]ßA[j]
13. A[j]ßtemp
14. endif
15. endfor
16. endfor
17.end procedure
5. void main()
6. { int L[5];
7. int i,N;
10. for(i=0;i<N;i++)
11. { printf(“Data ke-%i: “,i+1);
14. v_Bubble(L,N);
15.
18. for(i=0;i<N;i++)
19. { printf(“%3i”,L[i]); };
20. getche();
22.
26. for(a=0;a<=(N-2);a++)
27. { for(b=(N-1);b>=(a+1);b–)
Seperti pada algoritma Bubble Sort, proses memilih nilai maksimum /minimum dilakukan pada setiap
pass. Jika array berukuran N, maka jumlah pass adalah N-1.
…………..
(elemen yang tersisa adalah L[0], tidak perlu diurut karena hanya satu-satunya).
Jadi , pada setiap pass pengurutan terdapat proses mencari harga maksimum dan proses
pertukaran dua buah elemen array.
Misal, terdapat array L dengan N = 5 buah elemen yang belum terurut. Array akan diurutkan
secara Ascending (menaik), dengan algoritma maximum selection sort.
9 7 12 6 1
0 1 2 3
Pass 1 :
9 7 1 6 12
0 1 2 3 4
Pass 2 :
6 7 1 9 12
0 1 2 3 4
Pass 3:
(berdasarkan susunan array pada Pass 2)
6 1 7 9 12
0 1 2 3 4
Pass 4 :
1 6 7 9 12
0 1 2 3 4
1. //prosedur algoritma Maximum Selection Sort secara Ascending2. //I.S:array sudah berisi nilai integer
yang belum terurut
3. //F.S:nilai-nilai dalam array terurut secara Ascending
input N:integer)
5. KAMUS:
6. maks,k,j,temp:integer
7. ALGORITMA:8. for(k=(N-1);k>=0;kßk-1)
9. maksß0;
13. maksßj;
14. endif
15. endfor
17. endfor
18.end procedure
1. //prosedur algoritma Tukar Tempat2. //I.S:nilai-nilai yang dikirimkan sudah terdefinisi sebelumnya
3. //F.S:nilai yang dikirimkan tertukar nilainya
7. ALGORITMA:8. temp ß P
9. P ß M
10. M ß temp
11.endprocedure
Program lengkap penerapan algoritma Maximum Selection Sort Ascending dalam bahasa C
main()
{ int L[5];
int i,N;
for(i=0;i<N;i++)
v_SelAsc(L,N);
printf(“\nData Terurut:\n”);
for(i=0;i<N;i++)
getche();
{ int maks,k,j,temp;
for(k=(N-1);k>=0;k–)
{ maks=0;
for(j=0;j<=k;j++)
{ maks=j; } //endif
} //end loop j
v_Tukar(&A[k],&A[maks]);
} //end loop k
{ int temp;
temp = *P;
*P = *M;
*M = temp;
0 1 2 3 4
Pass 1 :
12 8 11 7 9
0 1 2 3 4
Pass 2 :
0 1 2 3 4
Pass 3 :
12 11 9 7 8
0 1 2 3 4
Pass 4 :
12 11 9 8 7
0 1 2 3 4
input N:integer)
5. KAMUS:
6. k,maks,j,temp:integer7. ALGORITMA:
8. for(k=0;k<=(N-2);kßk+1)
9. //cari elemen maksimum
10. maksßk
11. for(j=(k+1);j<=(N-1);jßj+1)
13. maksßj
14. endif
15. endfor
16. tempßA[k]
17. A[k]ßA[maks]
18. A[maks]ßtemp
19. endfor
Program lengkap penerapan algoritma Maximum Selection Sort Descending dalam bahasa C
1. #include <stdio.h>
2. #include <conio.h>
5. main()
6. { int L[5];
7. int i,k,j,maks,temp,N;
11. for(i=0;i<N;i++)
15. v_SelDesc(L,N);
17. for(i=0;i<N;i++)
19.
21. getche();
23.
27. for(k=0;k<=(N-2);k++)
29. maks=k;
30. for(j=(k+1);j<=(N-1);j++)
33. v_Tukar(&A[k],&A[maks]);
36.
37. void v_Tukar(int *P,int *M)
40. *P = *M;
41. *M = temp;
…………..
(elemen yang tersisa adalah L[N-1], tidak perlu diurut karena hanya satu-satunya).
Jadi, pada setiap pass pengurutan terdapat proses mencari harga minimum dan proses pertukaran
dua buah elemen array.
Misal, terdapat array L dengan N = 5 buah elemen yang belum terururt. Array akan diurutkan
secara Ascending (menaik), dengan algoritma minimum selection sort.
9 7 12 6 1
0 1 2 3 4
Pass 1 :
1 7 12 6 9
0 1 2 3 4
Pass 2 :
1 6 12 7 9
0 1 2 3 4
Pass 3:
1 6 7 12 9
0 1 2 3 4
Pass 4 :
1 6 7 9 12
0 1 2 3 4
10. min ß k
11. for(j=(k+1);j<=(N-1);jßj+1)
13. min ß j
14. endif
15. endfor
16. v_Tukar(A[k],A[min])
17.endfor
Program lengkap penerapan algoritma Minimum Selection Sort Ascending dalam bahasa C
1. #include <stdio.h>
2. #include <conio.h>
5. main()
6. { int L[5];
7. int i,j,k,min,temp,N;
11. for(i=0;i<N;i++)
15. v_minAsc(L,N);
18. for(i=0;i<N;i++)
21. getche();
23.
27. for(k=0;k<=(N-2);k++)
28. { min = k;
29. for(j=(k+1);j<=(N-1);j++)
30. { if (A[j] < A[min])
34.
38. *P = *M;
39. *M = temp;
0 1 2 3 4
Pass 1 :
9 8 11 12 7
0 1 2 3 4
Pass 2 :
9 12 11 8 7
0 1 2 3 4
Pass 3 :
11 12 9 8 7
0 1 2 3 4
Pass 4 :
12 11 9 8 7
0 1 2 3 4
9. for(k=(N-1);k>=1;kßk-1)
10. minß0
12. for(j=0;j<=k;jßj+1)
14. minßj
15. endif
16. endfor
17. v_Tukar(A[k],A[min])
20. endfor
Program lengkap penerapan algoritma Minimum Selection Sort Descending dalam bahasa C
1. #include <stdio.h>
2. #include <conio.h>
5. main()
6. { int L[5];
7. int i,N;
11. for(i=0;i<N;i++)
12. { printf(” Data ke-%i = “,i+1);
15. v_minDesc(L,N);
18. for(i=0;i<N;i++)
21. getche();
23.
27. for(k=(N-1);k>=1;k–)
28. { min = 0;
29. for(j=0;j<=k;j++)
34.
38. *P = *M;
39. *M = temp;
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 yang 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.
Misal terdapat array satu dimensi L, yang terdiri dari 7 elemen array (n=7). Array L sudah berisi data
seperti dibawah ini dan akan diurutkan secara ascending dengan algoritma Insertion Sort.
L[] 15 10 7 22 17 5 12
0 1 2 3 4 5 6
(Pass-1) Geser masing-masing satu langkah ke kanan semua nilai yang ada disebelah kiri
L[1] satu persatu apabila nilai tersebut lebih besar dari X.
Setelah itu insert-kan (sisipkan) X di bekas tempat nilai yang terakhir digeser.
(Pass-2) Geser masing-masing satu langkah ke kanan semua nilai yang ada disebelah kiri
L[2] satu persatu apabila nilai tersebut lebih besar dari X.
Setelah itu insert-kan (sisipkan) X di bekas tempat nilai yang terakhir di geser.
3. Demikian seterusnya untuk L[3], L[4],L[5], dan terakhir L[6] bila n = 7. Sehingga untuk n = 7 ada
6 passproses pengurutan.
Data awal: 15 10 7 22 17 5 12
0 1 2 3 4 5 6
Pass-1: 15 10 7 22 17 5 12 10
0 1 2 3 4 5 6 X
15 lebih besar dari 10, maka geser 15 ke kanan. Proses selesai karena sudah sampai kolom 1.
Kemudian insert X menggantikan 15.
15 15 7 22 17 5 12
0 1 2 3 4 5 6
10 15 7 22 17 5 12
0 1 2 3 4 5 6
Hasil Pass 1: 10 15 7 22 17 5 12
0 1 2 3 4 5 6
Pass-2: 10 15 7 22 17 5 12 7
0 1 2 3 4 5 6 X
Pass 2 dimulai dari L[2], X=L[2]=7.
15 lebih besar dari 7, maka geser 15 ke kanan. 10 lebih besar dari 7, maka geser 10 ke kanan.
Proses selesai karena sudah sampai kolom 1. Kemudian insert X menggantikan 10.
15 15 22 17 5 12
0 1 2 3 4 5 6
10 10 15 22 17 5 12
0 1 2 3 4 5 6
7 10 15 22 17 5 12
0 1 2 3 4 5 6
Hasil Pass 2: 7 10 15 22 17 5 12
0 1 2 3 4 5 6
Pass-3: 7 10 15 22 17 5 12 22
0 1 2 3 4 5 6 X
15 tidak lebih besar dari 22, maka proses selesai. Kemudian insert X menggantikan 22.
Proses berlanjut sampai Pass 6. Hasil tiap pass dapat digambarkan sebagai berikut:
Data awal: 15 10 7 22 17 5 12
0 1 2 3 4 5 6
Pass 1: 10 15 7 22 17 5 12
0 1 2 3 4 5 6
Pass 2: 7 10 15 22 17 5 12
0 1 2 3 4 5 6
Pass 3: 7 10 15 22 17 5 12
0 1 2 3 4 5 6
Pass 4: 7 10 15 17 22 5 12
0 1 2 3 4 5 6
Pass 5: 5 7 10 15 17 22 12
0 1 2 3 4 5 6
Pass 6: 5 7 10 12 15 17 22
0 1 2 3 4 5 6
9. kß1
10. while(k<=N-1)
11. ißk
12. XßA[i]
14. A[i]ßA[i-1]
15. ißi-1
16. endwhile
17. A[i]ßX
18. kßk+1
19. endwhile
#include <stdio.h>
#include <conio.h>
main()
{ int L[7];
int i,N;
for(i=0;i<N;i++)
v_insAsc(L,N);
printf(“Data terurut:\n”);
for(i=0;i<N;i++)
getche();
{ int k,X,i;
k=1;
while(k<=N-1)
{ i=k;
X=A[i];
{ A[i]=A[i-1];
i–; } //endwhile
A[i]=X;
k++; } //endwhile
} //end procedure
1. Algorithm Data Structures and Problem Solving with C++. 1997. Addison Wesley.
2. Moh. Sjukani, Algoritma dan Struktur Data. Mitra Wacana Media
3. Inggriani Liem, Diktat Catatan Singkat Bahasa C Agustus 2003. ITB
4. Inggriani Liem, Diktat Kuliah Dasar Pemrograman April 2007. ITB
5. Rinaldi Munir, Algoritma dan Pemrograman. Informatika Bandung
6. Schaum, Programming with C++ 2nd. 2000. McGraw-Hill
7. Schaum. Teach yourself C++ in 21 days. 2007. McGraw-Hill
8. http://www.cs.aau.dk/~normark/prog3-03/html/notes/paradigms_themes-
paradigms.html akses pada 18 Juli 2009 14.00
9. http://encyclopedia.thefreedictionary.com/Programming%20paradigm akses pada 18 Juli 2009
14.00
Pertama-tama adalah menentukan jarak mula-mula dari data yang akan dibandingkan, yaitu N / 2.
Data pertama dibandingkan dengan data dengan jarak N / 2. Apabila data pertama lebih besar dari
data ke N / 2 tersebut maka kedua data tersebut ditukar. Kemudian data kedua dibandingkan dengan
jarak yang sama yaitu N / 2. Demikian seterusnya sampai seluruh data dibandingkan sehingga
semua data ke-j selalu lebih kecil daripada data ke-(j + N / 2).
Pada proses berikutnya, digunakan jarak (N / 2) / 2 atau N / 4. Data pertama dibandingkan dengan
data dengan jarak N / 4. Apabila data pertama lebih besar dari data ke N / 4 tersebut maka kedua
data tersebut ditukar. Kemudian data kedua dibandingkan dengan jarak yang sama yaitu N / 4.
Demikianlah seterusnya hingga seluruh data dibandingkan sehingga semua data ke-j lebih kecil
daripada data ke-(j + N / 4).
Pada proses berikutnya, digunakan jarak (N / 4) / 2 atau N / 8. Demikian seterusnya sampai jarak
yang digunakan adalah 1.
1. Jarak = N
2. Selama (Jarak > 1) kerjakan baris 3 sampai dengan 9
3. Jarak = Jarak / 2. Sudah = false
4. Kerjakan baris 4 sampai dengan 8 selama Sudah = false
5. Sudah = true
6. j = 0
7. Selama (j < N – Jarak) kerjakan baris 8 dan 9
8. Jika (Data[j] > Data[j + Jarak] maka tukar Data[j],
Data[j + Jarak].
Sudah = true
9. j = j + 1
void ShellSort(int N)
{
int Jarak, i, j;
bool Sudah;
Jarak = N;
while(Lompat > 1)
{
Jarak = Jarak / 2;
Sudah = false;
while(!Sudah)
{
Sudah = true;
for(j=0; j<N-Jarak; j++)
{
i = j + Jarak;
if(Data[j] > Data[i])
{
Tukar(&Data[j], &Data[i]);
Sudah = false;
}}}}}
1) Divide: membagi masalah menjadi beberapa submasalah yang memiliki kemiripan dengan
masalah semula namun berukuran lebih kecil (idealnya berukuran hampir sama),
Deklarasi
r, k : integer
Algoritma
else
Bagi menjadi r upa-masalah, masing-masing berukuran n/k
endfor
COMBINE solusi dari r upa-masalah menjadi solusi masalah semula }
Endif
Diberikan sebuah array dengan elemen yang terdefinisi adalah sebagai berikut :
[ 6, 19, 2, 45, 33, 12 ]. Cari nilai max dan min dalam array
Procedure MinMax(input A : TabelInt, awal, akhir : int; output min, max : int)
Dimana A = lariknya
P= Posisi Indeks 1
r : posisi indeks 2
qß(p+r)/2 T(n) = 2
if p < r then 1
q¬(p+r)/2 (n/2)
Merge-Sort(A, p, q) T(n/2)
{copia l’array X in Y}
procedure copy_array(var X, Y:INTARRAY; n:integer);
var i:integer;
begin
for i := 0 to N do Y[i] := X[i];
end;
function min(a,b:integer):integer;
begin if a
else min := b;
end;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
printf(“%s”, in);
int i = 0;
printf(“\n”);
int i = p;
int j = q + 1;
int k = 0;
tmp[k++] = v[i++];
else
tmp[k++] = v[j++];
while (i <= q)
tmp[k++] = v[i++];
while (j <= r)
tmp[k++] = v[j++];
free(tmp);
if (p < r) {
int q = (p + r) / 2;
mergeS(v, p, q);
mergeS(v, q + 1, r);
merge(v, p, q, r);
int n = 10;
printv(“V: “, v, n);
mergeS(v, 0, n – 1);
printv(“V: “, v, n);
return 0;
Output :
Apa itu Radix Sort??? Radix Sort merupakan algoritma pengurutan yang ajaib yang mana mengatur
pengurutan nilainya tanpa melakukan beberapa perbandingan pada data yang dimasukkan. Kata
radix bermakna harafiah posisi dalam angka [1]. Di mana sederhananya, dalam representasi desimal,
radix adalah digitnya. Dalam implementasinya, Radix Sort merupakan algoritma pengurutan yang
cepat, mudah, dan sangat efektif. Namun banyak orang yang berpikir bahwa algoritma ini memiliki
banyak batasan di mana untuk kasus-kasus tertentu tidak dapat dilakukan dengan algoritma ini,
seperti pengurutan bilangan pecahan dan bilangan negatif,
Berdasarkan urutan pemrosesan radixnya, Radix Sort terbagi 2 macam, yaitu: LSD (Least Significant
Digit), di mana pemrosesan dimulai dari radix yang paling tidak signifikan. dan MSD (Most Significant
Digit), di mana pemrosesan dimulai dari radix yang paling signifikan.
Proses dasar Radix Sort adalah mengkategorikan data-data menjadi subkumpulan-subkumpulan data
sesuai dengan nilai radix-nya, mengkonkatenasinya, kemudian mengkategorikannya kembali
berdasar nilai radix lainnya.
#include
#include
main()
scanf(“%d”,&leng);
for (a=0;a
printf(“data %d = “,a+1);
scanf(“%d”,&d);
printf(“\nData %d= %d “,a+1,data[a]); } index=0; for (a=0;a<=9;a++) //lsb sort for (b=0;b { if
(data[b]<100) { m=data[b]%10; } else { m=data[b]%100; m=m%10; } if (m==a) { temp[index]=data[b];
index++; } } for (a=0;a<=9;a++) { data[a]=temp[a]; } index=0; for (a=0;a<=9;a++) //csb sort for (b=0;b {
if (data[b]<100) { m=data[b]/10; } else { m=data[b]%100; m=m/10; } if (m==a) { temp[index]=data[b];
index++; } } for (a=0;a<=9;a++) { data[a]=temp[a]; } index=0; for (a=0;a<=9;a++) //msb sort for (b=0;b {
m=data[b]/100; if (m==a) { temp[index]=data[b]; index++; } } for (a=0;a<=9;a++) { data[a]=temp[a]; }
printf(“\n\nSetelah di Sorting\n”); for (a=0;a<(leng);a++) { printf(“%d”,data[a]); printf(“\n”); } }
Algoritma :
Quick_sort (L,p,r)
Quick_sort (L,q+1,r)
AKHIR – JIKA
AKHIR – SUBRUTIN
Quick_sort (L,0,jumlah_elemen(L)-1)
x <– L[p]
i <– p
j <– r
j <– j – i
AKHIR – ULANG
AKHIR-ULANG
tmp=L[i]
L[j]<–tmp
SEBALIKNYA
NILAI – BALIK j
AKHIR-JIKA
AKHIR-ULANG
AKHIR-SUBRUTIN
Pertama-tama x <– L[q] dipakai untuk membagi larik L[p..r] menjadi dua bagian (disebut pemartisian)
dengan kondisi semua elemen bagian kiri selalu lebih kecil daripada nilai elemen pivot dan nilai
semua elemen bagian kanan selalu lebih kecil daripada nilai elemen pivot. Pemartisian dilakukan
dengan menggunakan varibel i dan j. Dalam hal ini i berupa petunjuk yang bergerak naik, sedangkan
j adalah penunjuk bergerak turun. Variabel j bergeser turun secara terus-menerus sehingga L[j]<=
elemen pivot, sedangkan i digeser naik secara terus-menerus sampai memenuhui kondisi L[j] >=
elemen pivot. Proses pengulangan dilakukan sampai nilai i >= j. Pada keadaan seperti ini nilai balik
subrutin partisi berupa j.
Implementasi ke dalam bahasa c++
#include <iostream.h>
#include <conio.h>
int i;
for (i=0;i<n;i++)
cout<<data[i]<<” “;
cout<<“\n”;
int x,i,j,tmp;
x=data[p];
i=p;
j=r;
while(1)
while(data[j]>x)
j=j-1;
while(data[i]<x)
i=i+1;
if (i<j)
//tukarkan data
tmp=data[i];
data[i]=data[j];
data[j]=tmp;
else
return j;
int q;
if(p<r)
{
q=partisi(data,p,r);
quick_sort(data,p,q);
quick_sort(data, q+1,r);
int main()
const jum_data=9;
int i;
int data[]={25,57,48,37,12,92,80,33,1};
cout<<data[ctr]<<” “;
quick_sort(data,0,jum_data-1);
//hasil pengurutan
cout<<endl;
cout<<endl;
cout<<“hasil pengurutan:\n”;
tampilkan_larik(data,jum_data);
getch();
1. Untuk mengisikan heap dimulai dari level 1 sampai ke level dibawahnya, bila dalam level yang
sama semua kunci heap belum terisi maka tidak boleh mengisi dibawahnya.
2. Heap dlm kondisi terurut apabila left child <> parent.
3. Penambahan kunci diletakkan pada posisi terakhir dari level dan disebelah kanan child yg
terakhir, kemudian diurutkan dengan cara upheap.
4. Bila menghapus heap dgn mengambil kunci pada parent di level 1 kemudian digantikan posisi
kunci terakhir, selanjutnya disort kembali metode downheap.
5. Berikut adalah langkah-langkahnya dari metode heap sort :
Dalam langkah-langkahnya heap sort terbagi menjadi 2 langkah yaitu insert_heap dan build_heap,
Insert_heap :
Pada bagian ini bertujuan untuk penghapusan suatu simpul pada heap tree. pemilihan sebuah simpul
untuk ditempatkan di posisi yang lebih atas, dan menjaga tree tersebut tetap sebuah heaptree.
Berikut langkahnya :
1. Setiap simpul yang dihapus(low) dicari anaknya yang memiliki kunci terbesar/terkecil(large)
2. Anak dengan kunci yang lebih besar dipromosikan ke tempat simpul yang di hapus.
Langkah 1 dan 2 akan di lakukan berulang kali sampai simpul yang dihapus tidak punya anak lagi
atau simpul yang ingin dipromosikan lebih besar/kecil daripada anak dari simpul yang dihapus yang
memiliki kunci terbesar/terkecil.
Build Heap :
Pada bagian ini kita akan merapikan data-data yang telah acak tadi, sehingga membentuk heap yang
sempurna. kita dapat menggunakan fungsi insert_heap untuk memasukkan setiap masukan ke
bagian heap yang terdiri dari semua masukan yang masuk. Sehingga jadilah heap yang sempurna.
Pseudocode :
Insert heap :
procedure Max-Heapify(A, i)
lc leftchild(i)
rc rightchild(i)
largest lc
else
largest i
largest rc
if largest 6= i then
Max-Heapify(A, largest)
Build heap :
procedure Build-Max-Heapify(A)
heapsize(A) length[A]
for i
_length[A]
downto 1
do Max-Heapify(A, i)
procedure Heapsort(A)
Build-Max-Heap(A)
for i length[A] downto 2 do
heapsize(A) heapsize(A) − 1
Max-Heapify(A, 1)
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
//—————————————————————————
int val;
}*TR;
//—————————————————————————
TR new_node()
TR new;
new=malloc(sizeof(struct heap));
new->left=new->right=NULL;
return(new);
//—————————————————————————
TR get_node()
{
TR new;
new=new_node();
scanf(“%d”,&new->val);
return(new);
//—————————————————————————
if(temp->val>new->val)
if(temp->left!=NULL)
insert_node(temp->left,new);
else
temp->left=new;
else
if(temp->right!=NULL)
insert_node(temp->right,new);
else
temp->right=new;
//—————————————————————————
{
if(temp!=NULL)
heap_sort(temp->left);
printf(“%d\t”,temp->val);
heap_sort(temp->right);
//—————————————————————————
TR create()
TR head,new,temp;
char c;
head=new_node();
new=get_node();
head->left=new;
c=getche();
while(c==’y’||c==’Y’)
new=get_node();
insert_node(head->left,new);
c=getche();
}
return(head);
//—————————————————————————
void main()
TR head;
int choice;
textcolor(10);
while(1)
clrscr();
scanf(“%d”,&choice);
switch(choice)
case 1:head=create();
break;
printf(“\n\n\t “);
heap_sort(head->left);
break;
if(getch()==27)
exit(0);
break;
getch();
SORTING
Sorting (Pengurutan Data) dapat didefinisikan sebagai suatu proses untuk menyusun kembali
humpunan obyek menggunakan aturan tertentu. Tujuan dari sorting yaitu memudahkan dalam
pencarian anggota dari suatu himpunan.
1) Selection Sort;
2) Insertion Sort;
3) Bubble Sort;
4) Radix Sort;
5) Merge Sort;
6) Shell Sort;
Disini saya akan membahas 3 metode sorting saja yaitu selection, insertion, dan bubble sort.
Dalam metode sorting, ada 2 macam pengurutan, yaitu pengurutan data dari kecil ke besar
(Ascending), dan pengurutan data dari yang terbesar ke terkecil (Descending).
SELECTION SORT
Metode seleksi adalah pengurutan data dengan cara mencari data yang terkecil kemudian
menukarnya dengan data yang digunakan sebagai acuan (pivot).
Proses dari Selection Sort Ascending adalah sebagai berikut :
1. Mencari data terkecil dari data pertama sampai dengan data yang terakhir. Kemudian posisinya
ditukar dengan data yang pertama.
2. Mencari data terkecil dari data kedua sampai dengan data terakhir, kemudian posisinya ditukar
dengan data yang kedua.
3. Mencari data terkecil dari data ketiga sampai dengan data terakhir, kemudian posisinya ditukar
dengan data yang ketiga.
4. Begitu seterusnya sampai semua data terurut naik. Apabila terdapat n buah data yang akan
diurutkan, maka membutuhkan (n-1) langkah pengurutan, dengan data terakhir, yaitu data ke
n tidak perlu diurutkan karena hanya tinggal data satu-satunya.
Untuk proses dari Selection Sort Descending (mencari data terbesar) adalah kebalikan dari
proses di atas.
Sebagai contoh :
Terdapat suatu variable array dimana nilai dalam array tersebut :
NILAI[8] = { 44, 55, 12, 42, 94, 18, 6, 67 }
Penyelesaiannya adalah :
Agar lebih jelasnya kita langsung saja ke studi kasusnya dan source codenya pada borland C++
:
Selection Sort Ascending
Inputkan banyaknya data yang akan dilakukan sorting (max. 10). Inputkan data sesuai dengan
banyaknya data yang diminta, kemudian urutkanlah data tersebut dari yang terkecil ke yang
terbesar!
Source code :
#include<iostream.h>
#include<conio.h>
int data[10];
int n;
int t;
t=data[b];
data[b]=data[a];
data[a]=t;
void main()
int pos,i,j;
cout<<"-------------------------------------------------"<<endl;
cout<<"-------------------------------------------------"<<endl;
cin>>n;
cout<<"-------------------------------------------------"<<endl;
for(int i=0;i<n;i++)
{
cin>>data[i];
cout<<"-------------------------------------------------"<<endl;
for(i=0;i<n;i++)
cout<<data[i]<<" ";
cout<<endl<<"-------------------------------------------------"<<endl;
for(i=0;i<n-1;i++)
pos=i;
for(j=i+1;j<n;j++)
if(data[j]<data[pos])pos=j;
if(pos!=i) tukar(pos,i);
for(int i=0;i<n;i++)
cout<<data[i]<<" ";
cout<<endl;
cout<<"-------------------------------------------------"<<endl;
getch();
#include<conio.h>
int data[10];
int n;
int t;
t=data[b];
data[b]=data[a];
data[a]=t;
void main()
int pos,i,j;
cout<<"-------------------------------------------------"<<endl;
cout<<"-------------------------------------------------"<<endl;
cin>>n;
cout<<"-------------------------------------------------"<<endl;
for(int i=0;i<n;i++)
cin>>data[i];
cout<<"-------------------------------------------------"<<endl;
for(i=0;i<n;i++)
cout<<data[i]<<" ";
cout<<endl<<"-------------------------------------------------"<<endl;
for(i=0;i<n-1;i++)
pos=i;
for(j=i+1;j<n;j++)
if(data[j]>data[pos])pos=j;
if(pos!=i) tukar(pos,i);
}
cout<<"DATA YANG TELAH DIURUTKAN SECARA DESCENDING : "<<endl;
for(int i=0;i<n;i++)
cout<<data[i]<<" ";
cout<<endl;
cout<<"-------------------------------------------------"<<endl;
cout<<"-------------------------------------------------"<<endl;
getch();
INSERTION SORT
Pada metode insertion sort, proses pengurutannya dimulai dari data ke-2 (indeks ke-1),
kemudian disisipkan pada tempat yang sesuai. Dan data pertama (data pada indeks ke-0)
dianggap sudah pada tempatnya.
Kita coba saja langsung ke studi kasus dan source codenya :
Insertion Sort Ascending
Studi Kasus :
Buatlah program seperti selection di atas, dan urutkan data tersebut dari terkecil ke terbesar
dengan menggunakan metode insertion sort.
Source code :
#include<iostream.h>
#include<conio.h>
int data[10];
int n;
void main()
int tmp,i,j;
cout<<"-------------------------------------------------"<<endl;
cout<<"-------------------------------------------------"<<endl;
cin>>n;
cout<<"-------------------------------------------------"<<endl;
for(int i=0;i<n;i++)
cin>>data[i];
cout<<"-------------------------------------------------"<<endl;
for(i=0;i<n;i++)
cout<<data[i]<<" ";
cout<<endl<<"-------------------------------------------------"<<endl;
for(i=1;i<n;i++)
tmp=data[i];
j=i-1;
data[j+1]=data[j];
j--;
data[j+1]=tmp;
for(int i=0;i<n;i++)
cout<<data[i]<<" ";
cout<<endl;
cout<<"-------------------------------------------------"<<endl;
cout<<"-------------------------------------------------"<<endl;
getch();
#include<conio.h>
int data[10];
int n;
void main()
int tmp,i,j;
cout<<"-------------------------------------------------"<<endl;
cout<<"-------------------------------------------------"<<endl;
cin>>n;
cout<<"-------------------------------------------------"<<endl;
for(int i=0;i<n;i++)
cin>>data[i];
cout<<"-------------------------------------------------"<<endl;
for(i=0;i<n;i++)
cout<<data[i]<<" ";
cout<<endl<<"-------------------------------------------------"<<endl;
for(i=1;i<n;i++)
tmp=data[i];
j=i-1;
data[j+1]=data[j];
j--;
data[j+1]=tmp;
for(int i=0;i<n;i++)
cout<<data[i]<<" ";
cout<<endl;
cout<<"-------------------------------------------------"<<endl;
cout<<"-------------------------------------------------"<<endl;
getch();
#include<conio.h>
int data[20];
int n;
void main()
int i, j, tmp;
cout<<"---------------------------------------------"<<endl;
cout<<"---------------------------------------------"<<endl;
cin>>n;
cout<<"---------------------------------------------"<<endl;
for(i=0; i<n; i++)
cin>>data[i];
cout<<"---------------------------------------------"<<endl;
cout<<data[i]<<" ";
cout<<endl<<"---------------------------------------------"<<endl;
if(data[i]>data[j])
tmp = data[i];
data[i] = data[j];
data[j] = tmp;
cout<<data[i]<<" ";
}
cout<<endl<<"---------------------------------------------"<<endl;
cout<<"---------------------------------------------"<<endl;
getch();
#include<conio.h>
int data[20];
int n;
void main()
int i, j, tmp;
cout<<"---------------------------------------------"<<endl;
cout<<"---------------------------------------------"<<endl;
cout<<"INPUTKAN BANYAKNYA DATA : ";
cin>>n;
cout<<"---------------------------------------------"<<endl;
cin>>data[i];
cout<<"---------------------------------------------"<<endl;
cout<<data[i]<<" ";
cout<<endl<<"---------------------------------------------"<<endl;
if(data[i]<data[j])
tmp = data[i];
data[i] = data[j];
data[j] = tmp;
cout<<data[i]<<" ";
cout<<endl<<"---------------------------------------------"<<endl;
cout<<"---------------------------------------------"<<endl;
getch();
Selection sort adalah suatu metode pengurutan yang membandingkan elemen yang sekarang
dengan elemen berikut sampai ke elemen yang terakhir. Jika ditemukan elemen lain yang lebih kecil
dari elemen sekarang maka dicatat posisinya dan langsung ditukar.
5 34 32 1
Daftar bilangan diatas masih belum urut dari kecil ke besar. Kita ingin melakukan pengurutan dari
yang terkecil sampai yang terbesar dari 3 data tersebut.
Langkah pertama , membandingkan satu persatu sampai dengan yang terkakhir. Langkah-
langkahnya sebagai berikut :
Langkah pertama :
Pembanding Posisi
5<34 1
5<32 1
5<1 4
Langkah Kedua :
Pembanding Posisi
34>32 3
32<5 4
---------------------------------------------------------------------------------------------------------------
#include <iostream>
#include <conio.h>
int data[100];
int n;
int main()
{
//Pendeklarasian variabel
int i,j,temp;
for(i=0;i<n-1;i++)
{
temp=i;
for(j=i+1;j<n;j++)
{
if(data[j]<data[temp])temp=j;
}
if(temp!=i)
{
tukar(temp,i);
}
}
for(int i=0;i<n;i++)
{
cout<<"Indeks ke-"<<i<<" : "<<data[i]<<endl;
}
getch();
return 0;
}