Skip to content

Merge Sort Algorithms

Published: at 오후 06:25

Table of contents

Open Table of contents

python 코드

import time, random, unittest




def get_merge_sorted(arr):

    if len(arr) <= 1:

        return arr



    mid = len(arr) // 2

    left_arr = get_merge_sorted(arr[:mid])

    right_arr = get_merge_sorted(arr[mid:])



    def merge(left, right):

        merged_arr = []

        left_idx, right_idx = 0, 0



        while left_idx < len(left) and right_idx < len(right):

            if left[left_idx] < right[right_idx]:

                merged_arr.append(left[left_idx])

                left_idx += 1

            else:

                merged_arr.append(right[right_idx])

                right_idx += 1



        # 여기로 왔다는 말은

        # left, right 둘 중 하나는 끝까지 다 돌았다는 뜻

        # 둘 중 하나만 돌았을 때는 위의 while문에서 이미 merged_arr에 추가가 되었기 때문에

        # 둘 중 하나만 돌았을 때는 그냥 나머지를 다 넣어주면 된다.



        while left_idx < len(left):

            merged_arr.append(left_arr[left_idx])

            left_idx += 1



        while right_idx < len(right):

            merged_arr.append(right_arr[right_idx])

            right_idx += 1



        return merged_arr



    partial_merged_list = merge(left_arr, right_arr)

    MergeSortTest.sort_procedure.append(partial_merged_list)

    return partial_merged_list




class MergeSortTest(unittest.TestCase):

    @classmethod

    def setUpClass(cls) -> None:

        print("0~1000까지의 정수 50개를 랜덤으로 생성합니다.")

        cls.random_numbers = [random.randint(0, 1000) for _ in range(50)]

        cls.sorted_random_numbers = sorted(cls.random_numbers)

        cls.sort_procedure = []

        print("Merge Sort 테스트 시작")



    @classmethod

    def tearDownClass(cls) -> None:

        print("\nMerge Sort 테스트 종료\n")



        print("Merge Sort 과정을 출력합니다.")

        for i, procedure in enumerate(cls.sort_procedure):

            print(f"{i + 1}번째 과정: {procedure}")



    def setUp(self) -> None:

        self.start_time = time.time()



    def tearDown(self) -> None:

        self.end_time = time.time()

        print(f"\n테스트 소요 시간: {self.end_time - self.start_time:4f}s")



    def test_merge_sort(self):

        self.assertEqual(

            get_merge_sorted(MergeSortTest.random_numbers),

            MergeSortTest.sorted_random_numbers,

        )




if __name__ == "__main__":

    unittest.main(verbosity=2)

How to Run

python version: 3.11.6

Run main.py

pip install pipenv
pipenv --python 3.11.6
pipenv run python3 main.py

Output

Loading .env environment variables...
0~1000까지의 정수 50개를 랜덤으로 생성합니다.
Merge Sort 테스트 시작
test_merge_sort (__main__.MergeSortTest.test_merge_sort) ...
테스트 소요 시간: 0.000105s
ok

Merge Sort 테스트 종료

Merge Sort 과정을 출력합니다.
1번째 과정: [558, 738]
2번째 과정: [558, 738, 928]
3번째 과정: [0, 668]
4번째 과정: [0, 668, 833]
5번째 과정: [0, 558, 668, 738, 833, 928]
6번째 과정: [589, 753]
7번째 과정: [287, 589, 753]
8번째 과정: [462, 951]
9번째 과정: [274, 462, 951]
10번째 과정: [274, 287, 462, 589, 753, 951]
11번째 과정: [0, 274, 287, 462, 558, 589, 668, 738, 753, 833, 928, 951]
12번째 과정: [124, 886]
13번째 과정: [89, 124, 886]
14번째 과정: [422, 799]
15번째 과정: [422, 475, 799]
16번째 과정: [89, 124, 422, 475, 799, 886]
17번째 과정: [236, 768]
18번째 과정: [236, 325, 768]
19번째 과정: [195, 322]
20번째 과정: [406, 788]
21번째 과정: [195, 322, 406, 788]
22번째 과정: [195, 236, 322, 325, 406, 768, 788]
23번째 과정: [89, 124, 195, 236, 322, 325, 406, 422, 475, 768, 788, 799, 886]
24번째 과정: [0, 89, 124, 195, 236, 274, 287, 322, 325, 406, 422, 462, 475, 558, 589, 668, 738, 753, 768, 788, 799, 833, 886, 928, 951]
25번째 과정: [368, 414]
26번째 과정: [72, 368, 414]
27번째 과정: [373, 825]
28번째 과정: [373, 800, 825]
29번째 과정: [72, 368, 373, 414, 800, 825]
30번째 과정: [346, 450]
31번째 과정: [24, 346, 450]
32번째 과정: [731, 909]
33번째 과정: [483, 731, 909]
34번째 과정: [24, 346, 450, 483, 731, 909]
35번째 과정: [24, 72, 346, 368, 373, 414, 450, 483, 731, 800, 825, 909]
36번째 과정: [423, 836]
37번째 과정: [125, 423, 836]
38번째 과정: [28, 665]
39번째 과정: [28, 505, 665]
40번째 과정: [28, 125, 423, 505, 665, 836]
41번째 과정: [535, 764]
42번째 과정: [151, 535, 764]
43번째 과정: [468, 547]
44번째 과정: [42, 171]
45번째 과정: [42, 171, 468, 547]
46번째 과정: [42, 151, 171, 468, 535, 547, 764]
47번째 과정: [28, 42, 125, 151, 171, 423, 468, 505, 535, 547, 665, 764, 836]
48번째 과정: [24, 28, 42, 72, 125, 151, 171, 346, 368, 373, 414, 423, 450, 468, 483, 505, 535, 547, 665, 731, 764, 800, 825, 836, 909]
49번째 과정: [0, 24, 28, 42, 72, 89, 124, 125, 151, 171, 195, 236, 274, 287, 322, 325, 346, 368, 373, 406, 414, 422, 423, 450, 462, 468, 475, 483, 505, 535, 547, 558, 589, 665, 668, 731, 738, 753, 764, 768, 788, 799, 800, 825, 833, 836, 886, 909, 928, 951]

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

Execution Image