Pengertian
Sorting merupakan suatu proses pengurutan
yang bermula dari data/elemen acak yang kemudian diurutkan baik secara asceding
(menaik) atau descending (menurun) dengan menggunakan aturan tertentu.
Tujuan melakukan sorting yaitu supaya data yang sudah terurut mudah untuk dicari, mudah untuk diperiksa, dan mudah diperbaiki apabila terdapat kesalahan. Dengan mengurutkan data maka semakin mudah untuk menyisipkan data atau penggabungan data.
Metode-metode
sorting yaitu :
1. Bubble
Sort (Metode Gelembung)
Merupakan suatu pengurutan dengan cara
penukaran data tepat dengan data disebelahnya secara berulang dan terus menerus
sampai data tidak bias ditukarkan lagi, jika tidak ada perubahan berarti data
sudah terurut. Merupakan metode pengurutan paling simple karena konsep dari
bubble sort ini adalah mengulang proses perbandingan dari tiap tiap elemen
data.
- Membandingkan data ke-i dengan data ke-(i+1) (tepat bersebelahan). Jika tidak sesuai maka tukar (data ke-i = data ke-(i+1) dan data ke-(i+1) = data ke-i). Apa maksudnya tidak sesuai?Jika kita menginginkan algoritma menghasilkan data dengan urutan ascending (A-Z) kondisi tidak sesuai adalah data i > data -i+1, dan sebaliknya.
- Membandingkan data ke-(i+1) dengan data ke-(i+2). Kita melakukan pembandingan ini sampai data terakhir. Contoh: 1 dgn 2; 2 dgn 3; 3 dgn 4; 4 dgn 5 … ; n-1 dgn n.
- Selesai satu iterasi, adalah jika kita sudah selesai membandingkan antara (n-1) dgn n. Setelah selesai satu iterasi kita lanjutkan lagi iterasi berikutnya sesuai dengan aturan ke-1. mulai dari data ke-1 dgn data ke-2, dst.
- Proses akan berhenti jika tidak ada pertukaran dalam satu iterasi.
Contoh Kasus :
Misalkan data yang akan diurutkan secara ascending :
6 3 9 1 5
Algoritma Bubble Sort
Secara Ascending
Procedure bubble_sort_asc(I/O nama_var_array : nama_tipe_array,
Procedure bubble_sort_asc(I/O nama_var_array : nama_tipe_array,
Input N : integer)
{I.S. : array(1..N) sudah terdefinisi}
{F.S. :
menghasilkan array(1..N) yang sudah tersusun secara ascending}
Kamus:
i,
j : integer
temp : tipedata
Algoritma:
for i ß 1 to N-1 do
for j ß n downto i+1 do
if(nama_var_array(j)
< nama_var_array(j-1))
then
temp ß
nama_var_array(j)
nama_var_array(j) ß
nama_var_array(j-1)
nama_var_array(j-1) ß temp
endif
endfor
endfor
EndProcedure
Data Yang Akan Diurutkan Secara Descending :
6 3 9 1 5
Algoritma Bubble Short
secara descending
Procedure
bubble_sort_dsc(I/O nama_var_array : nama_tipe_array, Input N : integer)
{I.S. : array(1..N) sudah terdefinisi}
{F.S. :
menghasilkan array(1..N) yang sudah tersusun secara descending}
Kamus:
i,j
: integer
temp : tipedata
Algoritma:
for i ß 1 to N-1 do
for j ß 1 to (N - i)
do
if(nama_var_array(j)
< nama_var_array(j+1))
then
temp ß
nama_var_array(j)
nama_var_array(j) ß
nama_var_array(j+1)
nama_var_array(j+1) ß temp
endif
endfor
endfor
EndProcedure
Kelebihan dan Kekurangan Bubble Sort
Kelebihan :
- Merupakan metode yang paling simpel.
- Mudah dipahami algoritmanya.
Kekurangan:
- · Untuk jumlah data yang banyak penggunaan metode bubble sort kurang efektif karena bisa memakan waktu yang lama dalam melakukan proses perbandingan atau pertukaran datanya.
2. Selection Sort (Metode Seleksi)
Merupakan metode
pengurutan yang memiliki konsep Maksimum dan Minimum dimana elemen- elemen data di bandingkan satu-persatu sampai pada
elemen terakhir dan disusun berdasarkan ketentuan-ketentuan berlaku lalu menukar
posisinya.
Seperti pada algoritma Bubble
Sort, proses memilih nilai maksimum /minimum dilakukan pada setiap pass.
Jika array berukuran N, maka jumlah pass adalah N-1.
Contoh
Kasus :
Algoritma Maximum Sort
Ascending
Procedure
Maximum_sort_asc(I/O
nama_var_array : nama_tipe_array, Input N : integer)
{I.S. :
array(1..N) sudah terdefinisi}
{F.S. :
menghasilkan array(1..N) yang sudah tersusun secara ascending}
Kamus:
i,
j, max, x : integer
temp : tipedata
Algoritma:
x ß n
for i ß 1 to N-1 do
max ß
1
for j ß 2 to x do
if(nama_var_array(j)
> nama_var_array(max))
then
max ß
j
endif
endfor
temp ß
nama_var_array(max)
nama_var_array(max) ß
nama_var_array(j)
nama_var_array(j) ß temp
x ß
x - 1
endfor
EndProcedure
Algoritma Minimum Sort Ascending
Procedure
Minimum_sort_asc(I/O nama_var_array : nama_tipe_array,
Input N : integer)
{I.S. : array(1..n) sudah terdefinisi}
{F.S. : menghasilkan array(1..n) yang
sudah tersusun secara ascending}
Kamus:
i, j, min : integer
temp :
tipedata
Algoritma:
for i ß 1 to (N – 1)
do
min ß
i
for j ß i+1 to N do
if(nama_var_array(j)
< nama_var_array(min))
then
min ß
j
endif
endfor
temp ß
nama_var_array(min)
nama_var_array(min) ß
nama_var_array(i)
nama_var_array(i) ß temp
endfor
EndProcedure
Kelebihan dan Kekurangan Selection Sort :
Kelebihan :
- Mudah untuk diimplementasikan.
- Operasi pertukarannya hanya dilakukan sekali saja.
- Waktu pengurutan dapat lebih cepat.
- Sulit untuk membagi masalah.
3. Insertion sort (Metode
Penyisipan)
Merupakan
suatu perbandingan data untuk mencari posisi yang “tepat” di setiap elemen
array.
Merupakan metode pengurutan yang membandingkan dua elemen data pertama
lalu mengurutkannya kemudian mengecek elemen data berikutnya satu persatu dan
membandingkannya dengan elemen data yang telah diurutkan.
Proses ini menyisipkan sebuah elemen array yang diproses
ke tempatnya yang seharusnya. Proses dilakukan sebanyak N-1, 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.
Metode Insertion
Sort bertujuan untuk menjadikan bagian sisi kiri array terurutkan sampai dengan
seluruh array berhasil diurutkan. Metode ini mengurutkan bilangan-bilangan yang
telah dibaca dan berikutnya secaraberulang akan menyisipkan bilangan-bilangan
dalam array yang belum terbaca ke sisi kiri array yang telah terurut.
Bagian biru/abu-abu (dua bilangan pertama)
sekarang dalam keadaan terurut secara relatif.
Berikutnya, kita perlu menyisipkan bilangan ketiga (4) ke dalam bagian biru/abu-abu sehingga
pertama : Ambil bilangan ketiga (4).
Jumlah Index = 6 dimulai dari 0 s/d 5
Anggaplah index adalah ‘I’,
Untuk setiap proses pengurutan data, perbandingan data dimulai dari index kedua (dalam hal ini i=1)
Proses I:
i=1, x=1, j=0
x<j à2<5 — true =2, 5, 4, 6, 1, 3
Proses II
i=2, j=1, x=2
x<j à 4<5 — true = 2, 4, 5, 6, 1, 3 j=j-1, Jika benar x=x-1
x<j à4<2 — false = 2, 4, 5, 6, 1, 3
Proses III
I=3, j=2, x=3
x<j à6<5 — false = 2, 4, 5, 6, 1, 3 j=j-1 1 jika sebuah proses bernilai false, maka proses tersebut tidak akan dilanjutkan, karena secara otomatis data yang ada disebelah kiri semuanya sudah terurut dengan benar.
Berikutnya, kita perlu menyisipkan bilangan ketiga (4) ke dalam bagian biru/abu-abu sehingga
setelah penyisipan tersebut, bagian biru/abu-abu tetap dalam keadaan terurut
secara relatif;
Caranya :
Kedua : Geser
bilangan kedua (10) shg ada ruang untuk disisipi.
Ketiga : Sisipkan bilangan
4 ke posisi yang tepat.
Sekarang, tiga
bilangan pertama sudah terurut secara relatif dan kita sisipkan bilangan
keempat kepada tiga bilangan pertama tsb. Setelah penyisipan, empat
bilangan pertama haruslah dalam keadaan terurut secara relatif.
Ulangi proses tsb
sampai bilangan terakhir disisipkan.
Proses Sorting
Selesai.
Contoh lain :
Contoh Kasus :
Dari gambaran proses pengurutan/ sorting data di atas dapat
diketahui bagaimana data-data tersebut berpindah posisi dari
satu index ke index lain dalam satu array. Untuk detail proses pengurutan
diatas, dapat disimak melalui detail simulasi berikut.
Data awal : 5, 2, 4, 6, 1, 3
Jumlah Index = 6 dimulai dari 0 s/d 5
Anggaplah index adalah ‘I’,
Untuk setiap proses pengurutan data, perbandingan data dimulai dari index kedua (dalam hal ini i=1)
Proses I:
i=1, x=1, j=0
x<j à2<5 — true =2, 5, 4, 6, 1, 3
Proses II
i=2, j=1, x=2
x<j à 4<5 — true = 2, 4, 5, 6, 1, 3 j=j-1, Jika benar x=x-1
x<j à4<2 — false = 2, 4, 5, 6, 1, 3
Proses III
I=3, j=2, x=3
x<j à6<5 — false = 2, 4, 5, 6, 1, 3 j=j-1 1 jika sebuah proses bernilai false, maka proses tersebut tidak akan dilanjutkan, karena secara otomatis data yang ada disebelah kiri semuanya sudah terurut dengan benar.
Proses IV
i=4, j=3, x=4
x<j à1<6 — true = 2, 4, 5, 1, 6, 3 j=j-1, jika benar maka x=x-1
x<j à 1<5 — true = 2, 4, 1, 5,6, 3 j=j-1 , jika benar maka x=x-1
x<j à1<4 — true = 2, 1, 4, 5,6, 3 j=j-1, jika benar maka x=x-1
x<j à 1<2 — true = 1, 2, 4, 5,6, 3
Proses V
i=5, j=4, x=5
x<j à3<6 — true = 1, 2, 4, 5,3, 6 j=j-1 , jika benar maka x=x-1
x<j à3<5 — true = 1, 2, 4, 3, 5, 6 j=j-1, jika benar maka x=x-1
x<j à3<4 — true = 1, 2, 3, 4, 5, 6 j=j-1, jika benar maka x=x-1
x<jà3<2 — false = 1, 2, 3, 4, 5, 6 j=j-1
i=4, j=3, x=4
x<j à1<6 — true = 2, 4, 5, 1, 6, 3 j=j-1, jika benar maka x=x-1
x<j à 1<5 — true = 2, 4, 1, 5,6, 3 j=j-1 , jika benar maka x=x-1
x<j à1<4 — true = 2, 1, 4, 5,6, 3 j=j-1, jika benar maka x=x-1
x<j à 1<2 — true = 1, 2, 4, 5,6, 3
Proses V
i=5, j=4, x=5
x<j à3<6 — true = 1, 2, 4, 5,3, 6 j=j-1 , jika benar maka x=x-1
x<j à3<5 — true = 1, 2, 4, 3, 5, 6 j=j-1, jika benar maka x=x-1
x<j à3<4 — true = 1, 2, 3, 4, 5, 6 j=j-1, jika benar maka x=x-1
x<jà3<2 — false = 1, 2, 3, 4, 5, 6 j=j-1
Kelebihan dan Kekurangan Insertion Sort :
Kelebihan :
- Sangat Sederhana.
- Sangat efisien untk data yang sangat kecil misalkan data kurang dari 10 or 20.
- Prosesnya yang cepat.
- Jika list sudah terurut atau sebagian sudah terurut maka Insertion Sort akan lebih cepat dibandingkan dengan Quick sort.
- Stabil.
- Untuk larik yang jumlahnya besar ini tidak praktis.
- Banyak Operasi yang Dilakukan.
- Jika list terurut terbalik maka proses Loopingnya akan lama.
4. Shell Sort (Metode shell)
Metode ini disebut juga dengan
metode pertambahan menurun (diminishing increment). Metode ini dikembangkan
oleh Donald L. Shell pada tahun 1959, sehingga sering disebut dengan Metode Shell Sort. Metode ini mengurutkan data dengan cara membandingkan suatu data
dengan data lain yang memiliki jarak tertentu, kemudian dilakukan penukaran
bila diperlukan. Proses pengurutan dengan metode Shell dapat dijelaskan sebagai
berikut :
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.
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.
Contoh Kasus :
Dalam Pascal :
Procedure
Shell(Var Temp : Data; JmlData : Integer);
Var
I,J, Jarak :
Integer;
Begin
Jarak := JmlData Div 2;
While Jarak > 0 Do
Begin
For I:=1
To JmlData-Jarak Do
Begin
J := I + Jarak;
If Temp[I] > Temp[J] Then
SWAP(Temp[I], Temp[Lok]);
End;
Jarak := Jarak Div 2;
End;
End;
Kelebihan dan Kekurangan Shell Sort :
Kelebihan :
- Operasi pertukarannya hanya sekali.
- · Mudah menggabungkaannya kembali.
Kekurangan :
- Membutuhkan metode tambahan.
- Sulit untuk membagi sebuah masalah pada data.
5. Quick Sort
Metode
ini dikembangkan oleh CAR Hoare. Secara garis besar metode ini dijelaskan
sebagai berikut. Misalnya kita ingin mengurutkan data A yang membunyai N
elemen. Kita pilih sembarang elemen dari data tersebut, biasanya elemen
pertama, misalnya X. Kemudain semua elemen tersebut disusun dengan menempatkan
X pada posisi J sedemikian rupa shingga elemen ke 1 sampai ke J-1 mempuyai
nilai lebih besar dari X. Sampai berikutnya diulang untuk setiap sub
data.
Divide and conquer adalah metode pemecahan masalah yang bekerja dengan membagi (divide) masalah menjadi beberapa sub-masalah yang sama atau berhubungan, hingga masalah tersebut menjadi sederhana untuk dipecahkan (conquer) secara langsung. Pemecahan dari tiap-tiap sub-masalah kemudian digabungkan untuk memberikan solusi terhadap masalah semula[6].
Metode divide and conquer menawarkan penyederhanaan masalah dengan pendekatan tiga langkah sederhana: pembagian masalah menjadi sekecil mungkin, penyelesaian masalah-masalah yang telah dikecilkan, kemudian digabungkan kembali untuk mendapat solusi optimal secara keseluruhan. Khusus untuk quicksort, proses penggabungan (combine) tidak perlu dilakukan, karena sudah terjadi secara alami.
Dalam penerapannya metode ini dilakukan secara rekursif, yaitu memanggil dirinya sendiri. Cara pemanggilan ini memanfaatkan mekanisme stack dalam menyimpan data yang sedang diproses. Namun bisa juga dengan versi non-rekursif yaitu dengan membuat struktur data tertentu yang meniru cara kerjastack.
Strategi divide-and-conqueror digunakan di dalam quicksort. Di bawah iniakan dijelaskan langkah-langkahnya :
Divide and conquer adalah metode pemecahan masalah yang bekerja dengan membagi (divide) masalah menjadi beberapa sub-masalah yang sama atau berhubungan, hingga masalah tersebut menjadi sederhana untuk dipecahkan (conquer) secara langsung. Pemecahan dari tiap-tiap sub-masalah kemudian digabungkan untuk memberikan solusi terhadap masalah semula[6].
Metode divide and conquer menawarkan penyederhanaan masalah dengan pendekatan tiga langkah sederhana: pembagian masalah menjadi sekecil mungkin, penyelesaian masalah-masalah yang telah dikecilkan, kemudian digabungkan kembali untuk mendapat solusi optimal secara keseluruhan. Khusus untuk quicksort, proses penggabungan (combine) tidak perlu dilakukan, karena sudah terjadi secara alami.
Dalam penerapannya metode ini dilakukan secara rekursif, yaitu memanggil dirinya sendiri. Cara pemanggilan ini memanfaatkan mekanisme stack dalam menyimpan data yang sedang diproses. Namun bisa juga dengan versi non-rekursif yaitu dengan membuat struktur data tertentu yang meniru cara kerjastack.
Strategi divide-and-conqueror digunakan di dalam quicksort. Di bawah iniakan dijelaskan langkah-langkahnya :
- · Pilih nilai pivot Kita ambil nilai di tengah-tengah elemen sebagai sebagai nilaidari pivot tetapi bisa nilai mana saja.
- · Partisi Atur ulang semua elemen sedemikian rupa, lalu semua elemen yang lebihrendah daripada pivot dipindahkan ke sebelah kiri dari array/list dan semuaelemen yang lebih besar dari pivot dipindahkan ke sebelah kanan dari array/list. Nilai yang sama dengan pivot dapat diletakkan di mana saja dari array. Ingat,mungkin array/list akan dibagi dalam bagian yang tidak sama.
- · Urutkan semua bagian (kiri/kanan) Aplikasikan algoritma quicksort secararekursif pada bagian sebelah kiri dan kanan.
Contoh dari proses Soring dengan menggunakan metode
Quick Sort :
Contoh Kasus :
Dalam Pascal :
Procedure
Quick(Var Temp : Data; Awal, Akhir : Integer);
Var
I,J : Integer;
Procedure ATUR;
Begin
I:=Awal +1;
J:= Akhir;
While Temp[I] < Temp[Awal]
Do Inc(I);
While Temp[J] >
Temp[Awal] Do Dec(J);
While I < J Do
Begin
SWAP(Temp[I], Temp[J]);
While Temp[I] < Temp[Awal] Do Inc(I);
While Temp[J] > Temp[Awal] Do Dec(J);
End;
SWAP(Temp[Awal],
Temp[J]);
End;
Begin
If Awal <
Akhir Then
Begin
ATUR;
Quick(Temp, Awal, J-1);
Quick(Temp,J+1,Akhir);
End;
End;
Kelebihan dan Kekurangan Quick Sort :
Kelebihan :
- Secara umum memiliki kompleksitas O(n log n).
- Algoritmanya sederhana dan mudah diterapkan pada berbagai bahasa pemrograman.
- Dalam prakteknya adalah yang tercepat dari berbagai algoritma pengurutan dengan perbandingan.
- Melakukan proses langsung pada input (in-place) dengan sedikit tambahan memori.
- Bekerja dengan baik pada berbagai jenis input data (seperti angka dan karakter).
Kekurangan :
- Sedikit kesalahan dalam penulisan program membuatnya bekerja tidak beraturan (hasilnya tidak benar atau tidak pernah selesai).
- Ttidak Stabil.
6. Merge Sort (Metode Penggabungan)
Merupakan metode pengurutan data
dengan cara data dibagi menjadi subkumpulan - subkumpulan yang kemudian
subkumpulan tersebut diurutkan secara terpisah, dan kemudian digabungkan
kembali dengan metode merging.
Merge sort merupakan algoritma pengurutan dalam
ilmu komputer yang dirancang untuk memenuhi kebutuhan pengurutan atas suatu
rangkaian data yang tidak memungkinkan untuk ditampung dalam memori komputer
karena jumlahnya yang terlalu besar. Algoritma ini ditemukan oleh John von
Neumann pada tahun 1945.
Algoritma pengurutan data merge sort dilakukan dengan menggunakan cara divide and conquer yaitu dengan memecah kemudian menyelesaikan setiap bagian kemudian menggabungkannya kembali. Pertama data dipecah menjadi 2 bagian dimana bagian pertama merupakan setengah (jika data genap) atau setengah minus satu (jika data ganjil) dari seluruh data, kemudian dilakukan pemecahan kembali untuk masing-masing blok sampai hanya terdiri dari satu data tiap blok.
Setelah itu digabungkan kembali dengan membandingkan pada blok yang sama apakah data pertama lebih besar daripada data ke-tengah+1, jika ya maka data ke-tengah+1 dipindah sebagai data pertama, kemudian data ke-pertama sampai ke-tengah digeser menjadi data ke-dua sampai ke-tengah+1, demikian seterusnya sampai menjadi satu blok utuh seperti awalnya. Sehingga metode merge sort merupakan metode yang membutuhkan fungsi rekursi untuk penyelesaiannya.
Algoritma pengurutan data merge sort dilakukan dengan menggunakan cara divide and conquer yaitu dengan memecah kemudian menyelesaikan setiap bagian kemudian menggabungkannya kembali. Pertama data dipecah menjadi 2 bagian dimana bagian pertama merupakan setengah (jika data genap) atau setengah minus satu (jika data ganjil) dari seluruh data, kemudian dilakukan pemecahan kembali untuk masing-masing blok sampai hanya terdiri dari satu data tiap blok.
Setelah itu digabungkan kembali dengan membandingkan pada blok yang sama apakah data pertama lebih besar daripada data ke-tengah+1, jika ya maka data ke-tengah+1 dipindah sebagai data pertama, kemudian data ke-pertama sampai ke-tengah digeser menjadi data ke-dua sampai ke-tengah+1, demikian seterusnya sampai menjadi satu blok utuh seperti awalnya. Sehingga metode merge sort merupakan metode yang membutuhkan fungsi rekursi untuk penyelesaiannya.
Contoh Kasus :
void mergeSort (int *T, int *temp, int Nmax)
/*I.S. T tabel dgn elemen bertipe*/
/* integer, T tidak kosong*/
/*F.S T terturut menaik*/
/* Proses : melakukan pengurutan*/
/* dengan melakukan metode sort*/
{
m_sort (T, temp, 0, Nmax -1);
}
void m_short (int *T, int *temp, int *left, int *right)
{
int mid;
if (*right > *left)
{
mid = (*right + *left) / 2;
m_sort (T, temp, left, mid);
m_sort (T, temp, mid+1, right);
merge (T, temp, left, mid+1, right);
}
}
void merge(int *T, int * temp, int left, int mid, int right)
{
int i, left_end, num_elements, tmp_pos;
/*I.S. T tabel dgn elemen bertipe*/
/* integer, T tidak kosong*/
/*F.S T terturut menaik*/
/* Proses : melakukan pengurutan*/
/* dengan melakukan metode sort*/
{
m_sort (T, temp, 0, Nmax -1);
}
void m_short (int *T, int *temp, int *left, int *right)
{
int mid;
if (*right > *left)
{
mid = (*right + *left) / 2;
m_sort (T, temp, left, mid);
m_sort (T, temp, mid+1, right);
merge (T, temp, left, mid+1, right);
}
}
void merge(int *T, int * temp, int left, int mid, int right)
{
int i, left_end, num_elements, tmp_pos;
left_end + mid-1;
tmp_pos = left;
num_elements = right – left + 1;
while ((left <= left_end) && (mid <= right))
{
if (*T[left] <= *T[mid])
{
*temp[tmp_pos] = *T[left];
tmp_pos = tmp_pos +1;
left = left +1;
}
else
{
*temp [tmp_pos] = *T [mid];
tmp_pos = tmp_pos + 1;
mid = mid +1;
}
}
while (left <= left_end);
{
*temp[tmp_pos] = *T[left];
left = left +1;
tmp_pos = tmp_pos +1;
}
while (mid <= right)
{
*temp [tmp_pos] = *T [mid];
mid = mid +1;
tmp_pos = tmp_pos + 1;
}
for (i=0; i <= num_elements; i++)
{
*T[right] = *temp[right];
right = right -1;
}
}
tmp_pos = left;
num_elements = right – left + 1;
while ((left <= left_end) && (mid <= right))
{
if (*T[left] <= *T[mid])
{
*temp[tmp_pos] = *T[left];
tmp_pos = tmp_pos +1;
left = left +1;
}
else
{
*temp [tmp_pos] = *T [mid];
tmp_pos = tmp_pos + 1;
mid = mid +1;
}
}
while (left <= left_end);
{
*temp[tmp_pos] = *T[left];
left = left +1;
tmp_pos = tmp_pos +1;
}
while (mid <= right)
{
*temp [tmp_pos] = *T [mid];
mid = mid +1;
tmp_pos = tmp_pos + 1;
}
for (i=0; i <= num_elements; i++)
{
*T[right] = *temp[right];
right = right -1;
}
}
Kelebihan dan Kekurangan Merge Sort :
Kelebihan :
- Sangat sederhana.
- Sangat efisien untk data yang sangat kecil.
- Prosesnya yang cepat.
Kekurangan :
- Banyak operasi yang dilakukan.
- Kinerja buruk atau kurang efisien jika data dalam jumlah yang besar.
7. Radix Sort
Radix
Sort adalah metode sorting tanpa pembandingan dengan kata lain, sorting
Non Comparasion sort dimana dalam prosesnya tidak melakukan perbandingan antar
data. Secara umum yang proses yang dilakukan dalam metode ini adalah
mengklasifikasikan data sesuai dengan kategori terurut yang tertentu dan dalam
tiap kategorinya dilakukan pengklasifikasian lagi dan seterusnya sesuai dengan
kebutuhan. Dan kemudian subkategori-subkategori tersebut digabungkan kembali,
yang secara dilakukan hanya dengan metode sederhana concatenation.
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.
Contoh
Kasus :
Dalam
C++ :
Realisasi radix
sort di C dapat dilihat pada Script di bawah ini :
//program C++
Redix Short
#include
<stdio.h>
#define MAX 20
#define SHOWPASS
#define BASE 10
void print(int *a,
int n)
{
int i;
for (i = 0;
i < n; i++)
printf("%d\t", a[i]);
}
void radixsort(int
*a, int n)
{
int i,
b[MAX], m = a[0], exp = 1;
//Get the
greatest value in the array a and assign it to m
for (i = 1;
i < n; i++)
{
if (a[i] > m)
m = a[i];
}
//Loop
until exp is bigger than the largest number
while (m /
exp > 0)
{
int bucket[BASE] = { 0 };
//Count the number of keys that will go into each bucket
for (i = 0; i < n; i++)
bucket[(a[i] / exp) % BASE]++;
//Add the count of the previous buckets to acquire the indexes after the end of
each bucket location in the array
for (i = 1; i < BASE; i++)
bucket[i] += bucket[i - 1]; //similar to count sort algorithm i.e.
c[i]=c[i]+c[i-1];
//Starting at the end of the list, get the index corresponding to the a[i]'s
key, decrement it, and use it to place a[i] into array b.
for (i = n - 1; i >= 0; i--)
b[--bucket[(a[i] / exp) % BASE]] = a[i];
//Copy array b to array a
for (i = 0; i < n; i++)
a[i] = b[i];
//Multiply exp by the BASE to get the next group of keys
exp *= BASE;
#ifdef SHOWPASS
printf("\nPASS : ");
print(a, n);
#endif
}
}
int main()
{
int
arr[MAX];
int i, n;
printf("Enter total elements (n <= %d) : ", MAX);
scanf("%d", &n);
n = n <
MAX ? n : MAX;
printf("Enter %d Elements : ", n);
for (i = 0;
i < n; i++)
scanf("%d", &arr[i]);
printf("\nARRAY : ");
print(&arr[0], n);
radixsort(&arr[0], n);
printf("\nSORTED
: ");
print(&arr[0], n);
printf("\n");
return 0;
}
Kelebihan dan Kekurangan Redix Short :
Kelebihan :
- Sangat efektif untuk data yang besar.
- Konsep Algoritma mudah dipahami
Kekurangan :
- Realisasi program rumit dan kurang fleksibel untuk digunakan pada tipe data lain.
8. Heap Sort
Heap sort adalah
algoritma yang paling lambat daripada algoritma yang memiliki
kompleksitas 0(n long n) lebih unggul daripada algoritma marge sort dan
quick sort karena tidak memerlukan rekursif yang besar. Untuk itu heap sort
sangatlah cocok sebuah kumpulan data yang besar.
Algoritma ini
bekerja dengan menentukan elemen terbesar atau elemen terkecil dari sbuah
daftar element, yang kemudian diletakkan di akhir atau di awal dari daftar tersebut.
Algoriyma ini
diawali dengan membuat array heap dgn membangun tumpukan dari kumpulan data
kemudian memindahkan data dari terbesar ke bagian belakang dari sebuah table
hasil, kemudian array heap tersebut dibangun kembali untuk mengambil elemen terbesar
yang kemudian diletakkan di sebelah item yang telah dipindahkan tadi. Hal ini
diulang-ulang sampai array heap habis.
Contoh Kasus :
Dalam C++ :
/heap sort
#include <iostream>
#include <conio.h>
using namespace std;
void max_heapify(int *a, int i, int n)
{
int j, temp;
temp = a[i];
j = 2*i;
while (j
<= n)
{
if (j
< n && a[j+1] > a[j])
j =
j+1;
if (temp
> a[j])
break;
else if
(temp <= a[j])
{
a[j/2] = a[j];
j =
2*j;
}
}
a[j/2] =
temp;
return;
}
void heapsort(int *a, int n)
{
int i, temp;
for (i = n;
i >= 2; i--)
{
temp =
a[i];
a[i] =
a[1];
a[1] =
temp;
max_heapify(a, 1, i - 1);
}
}
void build_maxheap(int *a, int n)
{
int i;
for(i = n/2;
i >= 1; i--)
{
max_heapify(a, i, n);
}
}
int main()
{
int n, i, x;
cout<<"enter no of elements of array\n";
cin>>n;
int a[20];
for (i = 1;
i <= n; i++)
{
cout<<"enter element"<<(i)<<endl;
cin>>a[i];
}
build_maxheap(a,n);
heapsort(a,
n);
cout<<"sorted output\n";
for (i = 1;
i <= n; i++)
{
cout<<a[i]<<endl;
}
getch();
}
Kelebihan
dan Kekurangan Heap Sort :
Kelebihan :
- Baik digunakan pada larik yang banyak atau sedikit.
- Proses Cepat.
Kekurangan
:
- Menggunakan banyak operasi.
Referensi :
:
sangat bermanfaat
BalasHapus