Menu
CoddyTech

Merge Sort

Terakhir diperbarui

Merge sort adalah algoritma divide and conquer. Algoritma ini membagi array menjadi dua secara rekursif sampai setiap bagian hanya berisi satu elemen (yang dengan sendirinya sudah terurut), lalu menggabungkan bagian-bagian itu kembali secara berurutan. Langkah penggabungan menyusuri dua subarray yang terurut dengan dua pointer, dan selalu menyalin elemen terdepan yang lebih kecil sebagai elemen berikutnya. Tekan Putar di atas untuk melihat array dibangun ulang dari satu penggabungan ke penggabungan berikutnya.

Karena selalu membagi dua, merge sort berjalan dalam waktu O(n log n) pada setiap kasus: kasus terburuknya sama baiknya dengan kasus terbaiknya. Harganya adalah ruang tambahan O(n) untuk buffer penggabungan sementara.

Kompleksitas waktu dan ruang

KasusKompleksitasCatatan
Kasus terbaikO(n log n)Selalu membagi input menjadi dua
Kasus rata-rataO(n log n)Urutan acak
Kasus terburukO(n log n)Terjamin: tidak ada input yang buruk
RuangO(n)Buffer sementara untuk penggabungan
StabilYaNilai yang sama diambil dari kiri lebih dulu saat penggabungan

Langkah demi langkah

LangkahApa yang terjadi
1Jika rentangnya berisi 0 atau 1 elemen, rentang itu sudah terurut.
2Bagi rentang menjadi dua bagian.
3Jalankan merge sort secara rekursif pada bagian kiri.
4Jalankan merge sort secara rekursif pada bagian kanan.
5Gabungkan kedua bagian yang sudah terurut dengan dua pointer.

Contoh penerapan

Mengurutkan [5, 2, 4, 1]:

TahapArrayAksi
Bagi[5, 2] | [4, 1]Bagi array menjadi dua bagian
Bagi[5] [2] | [4] [1]Bagi lagi sampai setiap bagian hanya berisi satu elemen
Gabung[2, 5] | [1, 4]Gabungkan [5],[2] menjadi [2, 5] dan [4],[1] menjadi [1, 4]
Gabung[1, 2, 4, 5]Gabungkan [2, 5] dan [1, 4]: ambil 1, lalu 2, lalu 4, lalu 5
Selesai[1, 2, 4, 5]Array sudah terurut sepenuhnya

Kapan memakai merge sort

Pakai saatHindari saat
Kamu butuh kasus terburuk O(n log n) yang terjaminMemori terbatas dan ruang tambahan O(n) tidak bisa diterima
Stabilitas penting (key yang sama mempertahankan urutannya)Kamu mengurutkan array kecil, di mana insertion sort lebih cepat
Kamu mengurutkan linked listPengurutan in-place adalah syarat mutlak
Datanya terlalu besar untuk RAM (external sorting)Lokalitas cache paling menentukan dan putaran in-place milik quicksort lebih unggul

Kode Merge Sort

Implementasi Merge Sort yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C, Pseudocode. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Merge Sort dalam Python

Python
1def merge_sort(a):2    if len(a) <= 1:3        return a4    mid = len(a) // 25    left = merge_sort(a[:mid])6    right = merge_sort(a[mid:])7    return merge(left, right)8
9
10def merge(left, right):11    out = []12    i = j = 013    while i < len(left) and j < len(right):14        if left[i] <= right[j]:15            out.append(left[i])16            i += 117        else:18            out.append(right[j])19            j += 120    out.extend(left[i:])21    out.extend(right[j:])22    return out23
24
25nums = [38, 27, 43, 3, 9, 82, 10]26print("Before:", nums)27print("After: ", merge_sort(nums))
Jalankan kode ini di Playground Python

FAQ Merge Sort

Berapa kompleksitas waktu merge sort?
Merge sort bernilai O(n log n) pada kasus terbaik, rata-rata, dan terburuk, karena selalu membagi array menjadi dua. Algoritma ini memakai ruang tambahan O(n) untuk buffer penggabungan.
Apakah merge sort stabil?

Ya, jika langkah penggabungan menangani nilai yang sama dengan mengambil dari bagian kiri lebih dulu. Cara ini menjaga elemen yang sama tetap dalam urutan relatif aslinya, itulah sebabnya merge sort menjadi pilihan umum untuk pengurutan yang stabil.

Mengapa memakai merge sort, bukan quicksort?
Merge sort menjamin O(n log n) bahkan pada input yang sengaja dibuat buruk dan bersifat stabil, sedangkan quicksort bisa merosot menjadi O(n²). Merge sort juga lebih dipilih untuk linked list dan external sorting. Kekurangannya adalah memori tambahan O(n).
Apa perbedaan merge sort dan quicksort?
Keduanya adalah algoritma pengurutan divide and conquer, tetapi quicksort mempartisi di sekitar pivot dan mengurutkan secara in-place dengan ruang stack O(log n), sedangkan merge sort membagi dua begitu saja dan menggabungkan dengan buffer O(n). Quicksort biasanya lebih cepat dalam praktik berkat lokalitas cache, tetapi merge sort punya kasus terburuk O(n log n) yang terjamin dan bersifat stabil.
Kapan sebaiknya memakai merge sort dalam praktik?
Pakai merge sort saat kamu butuh pengurutan stabil dengan batas O(n log n) yang terjamin, saat mengurutkan linked list (yang tidak butuh akses acak), atau saat melakukan external sorting untuk data yang terlalu besar untuk muat di memori. Hindari merge sort saat memori terbatas, karena algoritma ini butuh ruang tambahan O(n).
Apakah merge sort mengurutkan secara in-place?
Tidak. Merge sort standar mengalokasikan buffer sementara O(n) untuk menggabungkan kedua bagian, jadi tidak in-place. Ada varian penggabungan in-place, tetapi rumit dan entah lebih lambat atau kehilangan stabilitas, jadi versi berbasis buffer tetap menjadi pilihan umum.
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai