sort
1. Pendahuluan
Hybrid algorithm adalah sebuah algoritma yang menggabungkan dua atau lebih
algoritma yang bertujuan untuk meningkatkan performa atau reliability. Hybrid algorithm
yang dibahas untuk paper ini berkaitan dengan masalah pengurutan atau sorting. Algoritma
sorting tersebut adalah Introsort (Introspective sort), Timsort, dan MyIdeaExperiment sort.
MyIdeaExperiment sort adalah algoritma sorting yang diimplementasi dengan mengambil ide
dari Introsort. Tujuan dari paper ini adalah mengetahui performa dari Hybrid algorithm baru
(MyIdeaExperiment sort) yang juga menggunakan Hybrid algorithm (Timsort) untuk
dibandingkan dengan Hybrid algorithm murni yaitu Introsort yang merupakan gabungan dari
Insertion sort, Quicksort, Heapsort.
Paper ini membahas Introsort, Timsort, dan MyIdeaExperiment sort beserta analisis
kompleksitas dan running time terhadap Array Decreasing Order, Array Acak, dan Array
dengan nilai tiap elemen sama. Paper ini dibagi menjadi tujuh bagian. Bagian 1 berisi
pendahuluan, bagian 2 berisi penjelasan dan cara kerja Introsort, bagian 3 berisi penjelasan dan
cara kerja Timsort, bagian 4 berisi penjelasan dan cara kerja MyIdeaExperiment sort, bagian 5
berisi eksperimen, bagian 6 berisi analisis, dan bagian 7 berisi kesimpulan.
Quicksort adalah salah satu algoritma sorting yang cukup baik dengan performa pada
kasus rata rata adalah O(n log n). Namun pada kasus terburuk performanya bisa mencapai
Θ(n2). Hal tersebut tentunya juga mempengaruhi performa dari program yang dibuat sehingga
digunakan alternatif lain yaitu Heapsort. Heapsort memiliki performa Θ(n log n) untuk kasus
terbaik, kasus rata – rata, dan kasus terburuk. Selain time complexity, Heapsort juga unggul
dari sisi space complexity yaitu hanya membutuhkan O(1) dibandingkan dengan Quicksort
yang butuh O(log(n)) dan Mergesort yang butuh O(n). Hal – hal tersebut akhirnya mendorong
dibuatnya Introsort yang menggabungkan Quicksort dan Heapsort menjadi sebuah algoritma
baru. Selain itu, Introsort juga menggunakan Insertion sort. Introsort sendiri digunakan untuk
melakukan pengurutan pada C++ Standard Template Library.
Introsort bekerja seperti Insertion sort jika jumlah input elemen sangat kecil
sedemikian hingga ukuran partisi yang dibuat kurang dari 16. Ukuran partisi tersebut
berdasarkan penelitian dilakukan oleh pembuat kode Introsort. Ini merupakan kasus pertama.
Introsort bekerja seperti Quicksort jika jumlah input elemen cukup besar sedemikian
hingga ukuran partisi yang dibuat berada di antara dengan 16 sampai 2*log N (pada kode yang
digunakan, sudah ditentukan maksimal ukuran partisi adalah 2*log N). Quicksort
menggunakan metode median-of-3 dalam menentukan pivot untuk melakukan partisi dari
jumlah input berukuran N menjadi N/2 lalu N/4 dan seterusnya. Ini merupakan kasus kedua.
Jika ukuran partisi tersebut berkembang menjadi tree dengan kedalaman lebih dari
2*log N , maka dapat menyebabkan kompleksitas menjadi O(n2). Hal tersebut menjadi
indikator yang membuat Introsort beralih menggunakan Heapsort yang mempunyai
kompleksitas O(n log n) . Ini merupakan kasus ketiga. Berikut potongan kode Introsort :
Kompleksitas :
T(n) = c1*O(1) + c2*O(n2) + c3*O(n) + c4*O(1) + c5*(O(n2) + O(nlogn) + O(1) + O(1) + O(n)
+ 2*O(n/2)) + c6*(2*O(log log n) + O(n2) + O(nlogn) + O(1) + O(1) + O(n) + 2*O(n/2))
Pada penjumlahan di atas terlihat bahwa kompleksitas terbesar adalah O(n2) sehingga dapat
dikatakan bahwa secara default, kompleksitas dari Introsort adalah O(n2) walaupun dapat
berubah berubah sesuai kasus yang sudah sudah dijelaskan di atas.
T(n) = O(n2)
3. Penjelasan dan Cara Kerja TimSort
Timsort adalah algoritma sorting yang dibuat oleh Tim Peters pada 2002 dan digunakan
untuk Bahasa Python dengan kompleksitas O(n log n). Ide yang digunakan algoritma tersebut
adalah membagi sebuah array menjadi beberapa blok run. Blok run adalah beberapa elemen
array yang sudah terurut dalam urutan increasing atau decreasing. Ukuran blok run bervariasi
dari 32 sampai 64. Jika ukuran array kurang dari blok run maka akan diurutkan menggunakan
Insertion sort. Jika lebih maka dilanjutkan dengan pengurutan menggunakan Merge sort.
Penggunaan dua algoritma sorting tersebut membuat Timsort juga termasuk Hybrid algorithm.
Array berukuran 22 yang terbagi menjadi 4 blok run. Gunakan Insertion sort untuk
mengurutkan blok run menjadi increasing order.
Jika blok run sudah terurut, lakukan pengurutan dengan Merge sort.
Kompleksitas :
T(n) = c1*O(1) + c2*O(n2) + c3*O(n) + c4*O(1) + c5*(O(n2) + O(nlogn) + O(1) + O(1) + O(n)
+ 2*O(n/2)) + c6*(2*O(log log n) + O(n2) + O(nlogn) + O(1) + O(1) + O(n) + 2*O(n/2))
Pada penjumlahan di atas terlihat bahwa kompleksitas terbesar adalah O(n2) sehingga dapat
dikatakan bahwa secara default, kompleksitas dari MyIdeaExperiment sort adalah O(n2)
walaupun dapat berubah berubah sesuai kasus seperti Introsort.
T(n) = O(n2)
5. Eksperimen
Fungsi clock() berada dalam fungsi main() yang merupakan fungsi utama yang
dijalankan dalam bahasa C++. Pada implementasi dengan kedua kode tersebut, dilakukan
pemanggilan fungsi clock() di dua baris berbeda yaitu sebelum dan sesudah pemanggilan
fungsi introsort(). Secara default, clock ticks yang dikembalikan dari kedua baris tersebut lalu
dibagi CLOCKS_PER_SEC menghasilkan running time dalam satuan detik. Namun, agar lebih
presisi diubah dalam milidetik sehingga dikalikan 1000.0 sebelum dibagi dengan
CLOCKS_PER_SEC. Berikut potongan kode dari fungsi main():
1 int main()
2 {
3
4 int arr[] = {};
5 int n = sizeof(arr) / sizeof(arr[0]);
6
7 clock_t start = clock();
8
9 Introsort(arr, arr, arr+n-1);
10
11 clock_t stop = clock();
12
13 double elapsed = (double)(stop - start)
14 * 1000.0 / CLOCKS_PER_SEC;
15
16 printf("Time elapsed in ms: %f",
17 elapsed);
18 printf(" ");
19 return(0);
20 }
Potongan kode fungsi main() diperoleh dari : https://www.geeksforgeeks.org/know-your-sorting-algorithm-set-
2-Introsort-cs-sorting-weapon/
Eksperimen dilakukan pada laptop dengan spesifikasi sistem operasi Ubuntu 16.04.5
LTS, processor Intel i5 – 7200U @3.1 GHz , dan RAM 8GB DDR4.
Eksperimen dilakukan dengan menggunakan 3 jenis array yaitu array dengan elemen
acak, array dengan elemen terurut dalam decreasing order, dan array dengan elemen yang
sama. Ketiga jenis array tersebut dihasilkan dengan program yang diimplementasi sendiri
dengan bahasa Python. Berikut adalah kode untuk menghasilkan array :
1 import random
2
3 list = []
4 #x= 5000
5 #x = 5
6
7 for i in range(0,10000):
8 #x = random.randint(-500000,500000)
9 #x = x - 1
10 list.append(x)
11
12 with open('out.txt', 'w') as f:
13 print(list, file=f)
14
15
Sumber kode diperoleh dari : implementasi sendiri
Hasil dari program tersebut lalu disimpan dalam file bernama “out.txt”. Untuk jumlah input
elemen, digunakan 9 jenis input yang masing – masing berjumlah 100 elemen, 500 elemen,
1000 elemen, 5000 elemen, 10000 elemen, 50000 elemen, 100000 elemen, 500000 elemen,
dan 1000000 elemen. Jumlah input elemen yang digunakan hanya sampai 1000000 elemen
karena ketika menggunakan 5000000 elemen, text editor yang digunakan tidak merespon
(crash).
6. Analisis
Introsort sebagai sebuah Hybrid algorithm menunjukkan performa yang cukup baik.
Dari 9 input yang dilakukan, Introsort baru mulai menunjukkan kenaikan laju yang cukup
signifikan saat jumlah input = 100000. Terlihat saat jumlah input tersebut, running time yang
dibutuhkan adalah 2 kali saat jumlah input = 50000 dan saat jumlah input = 500000 dan
1000000 sudah mencapai 6 kali. Eksperimen ini membuktikan bahwa semakin besar input yang
diberikan maka Introsort akan bekerja seperti Heapsort sesuai dengan yang dijelaskan pada
paper rujukan. Eksperimen juga menunjukkan dari tiga jenis array yang dilakukan pengurutan,
Introsort paling cepat dalam melakukan pengurutan pada array dengan elemen acak
dibandingkan dengan array lain dan hal tersebut konsisten di semua jumlah jenis input.
7. Kesimpulan
Allain, Alex. “Debugging Segmentation Faults and Pointer Problems.” Writing Secure Code in C
- Cprogramming.com, www.cprogramming.com/debugging/segfaults.html.
Belwariar, Rachit. “Know Your Sorting Algorithm | Set 2 (Introsort- C 's Sorting
Introsort-cs-sorting-weapon/.
Malek, Miroslaw, and Ahmed Azfar Moin. A Hybrid Technique for Deterministic Algorithms
pdfs.semanticscholar.org/813e/964caabcd0dc60a0926e89f7adca1e91b668.pdf.
citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.5196&rep=rep1&type=pdf.
www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-
merge-sort.