diff --git a/DIRECTORY.md b/DIRECTORY.md index 283a0f45..b12cea6e 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -145,6 +145,7 @@ * [Bead Sort](https://github.com/bellshade/Python/blob/main/algorithm/sorting/bead_sort.py) * [Bubble Sort](https://github.com/bellshade/Python/blob/main/algorithm/sorting/bubble_sort.py) * [Bubble Sort Ascii](https://github.com/bellshade/Python/blob/main/algorithm/sorting/bubble_sort_ascii.py) + * [Merge Sort](https://github.com/bellshade/Python/blob/main/algorithm/sorting/merge_sort.py) * [Pop Sort](https://github.com/bellshade/Python/blob/main/algorithm/sorting/pop_sort.py) * [Quick Sorting](https://github.com/bellshade/Python/blob/main/algorithm/sorting/quick_sorting.py) diff --git a/algorithm/sorting/merge_sort.py b/algorithm/sorting/merge_sort.py new file mode 100644 index 00000000..d78aa165 --- /dev/null +++ b/algorithm/sorting/merge_sort.py @@ -0,0 +1,56 @@ +from __future__ import annotations + + +def merge_sort(data: list) -> list: + """ + merge sort adalah algoritma sorting data yang yang bekerja + dengan bekerja dengan membagi data menjadi dua bagian secara + rekursif, megnrutukan kedua bagian secara terpisah, lalu + menggabungkan kembali dua bagian tersebut dengan urutan + yang benar + + referensi: + https://en.wikipedia.org/wiki/Merge_sort + + Args: + data (list): beberapa data yang bisa berubah sebanding dengan + item yang sebanding di dalamnya + + Return: + (list): data hasil yang berupa ascending + + Contoh: + >>> merge_sort([0, 6, 3, 2, 1]) + [0, 1, 2, 3, 6] + """ + + def merge(kiri: list, kanan: list) -> list: + """ + gabungkan data kiri dan kanan + + Args: + kiri (list): data list kiri + kanan (kanan): data list kanan + + Return: + (list): data gabungan dari kiri dan kanan + """ + + def _gabung(): + while kiri and kanan: + yield (kiri if kiri[0] <= kanan[0] else kanan).pop(0) + yield from kiri + yield from kanan + + return list(_gabung()) + + if len(data) <= 1: + return data + mid = len(data) // 2 + return merge(merge_sort(data[:mid]), merge_sort(data[mid:])) + + +if __name__ == "__main__": + import doctest + + doctest.testmod()