Skip to content

Quick Sort

Published: at 오후 02:35

Table of contents

Open Table of contents

Python 코드

import time, random, unittest




def get_quick_sorted(arr):

    if len(arr) < 2:

        return arr

    else:

        pivot = arr[0]

        left = [*filter(lambda x: x <= pivot, arr[1:])]

        right = [*filter(lambda x: x > pivot, arr[1:])]

        partial_sorted = get_quick_sorted(left) + [pivot] + get_quick_sorted(right)

        QuickSortTest.과정.append(partial_sorted)

        return partial_sorted




class QuickSortTest(unittest.TestCase):

    @classmethod

    def setUpClass(cls) -> None:

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

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

        cls.sorted_random_numbers = sorted(cls.random_numbers)

        cls.과정 = []

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



    @classmethod

    def tearDownClass(cls) -> None:

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



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

        for i, 과정_리스트 in enumerate(cls.과정):

            print(f"{i + 1}번째 과정: {과정_리스트}")



    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_quick_sort(self):

        self.assertEqual(

            get_quick_sorted(QuickSortTest.random_numbers),

            QuickSortTest.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

0~1000까지의 정수 100개를 랜덤으로 생성합니다.
Quick Sort 테스트 시작
test_quick_sort (__main__.QuickSortTest.test_quick_sort) ...
테스트 소요 시간: 0.000278s
ok

Quick Sort 테스트 종료

Quick Sort 과정을 출력합니다.
1번째 과정: [63, 64]
2번째 과정: [38, 57, 63, 64]
3번째 과정: [34, 38, 57, 63, 64]
4번째 과정: [81, 82, 83]
5번째 과정: [34, 38, 57, 63, 64, 65, 81, 82, 83]
6번째 과정: [103, 122]
7번째 과정: [103, 122, 123, 150]
8번째 과정: [103, 122, 123, 150, 153, 157]
9번째 과정: [103, 122, 123, 150, 153, 157, 176]
10번째 과정: [94, 103, 122, 123, 150, 153, 157, 176]
11번째 과정: [94, 103, 122, 123, 150, 153, 157, 176, 184, 196]
12번째 과정: [34, 38, 57, 63, 64, 65, 81, 82, 83, 83, 94, 103, 122, 123, 150, 153, 157, 176, 184, 196]
13번째 과정: [248, 255]
14번째 과정: [234, 248, 255]
15번째 과정: [234, 248, 255, 256]
16번째 과정: [223, 234, 248, 255, 256]
17번째 과정: [290, 293]
18번째 과정: [266, 284, 290, 293]
19번째 과정: [299, 303]
20번째 과정: [299, 303, 324]
21번째 과정: [298, 299, 303, 324]
22번째 과정: [266, 284, 290, 293, 293, 298, 299, 303, 324]
23번째 과정: [355, 361, 362]
24번째 과정: [266, 284, 290, 293, 293, 298, 299, 303, 324, 333, 355, 361, 362]
25번째 과정: [223, 234, 248, 255, 256, 258, 266, 284, 290, 293, 293, 298, 299, 303, 324, 333, 355, 361, 362]
26번째 과정: [34, 38, 57, 63, 64, 65, 81, 82, 83, 83, 94, 103, 122, 123, 150, 153, 157, 176, 184, 196, 204, 223, 234, 248, 255, 256, 258, 266, 284, 290, 293, 293, 298, 299, 303, 324, 333, 355, 361, 362]
27번째 과정: [383, 391, 392]
28번째 과정: [383, 391, 392, 402]
29번째 과정: [433, 435]
30번째 과정: [428, 433, 435]
31번째 과정: [428, 433, 435, 436]
32번째 과정: [428, 433, 435, 436, 471, 483]
33번째 과정: [383, 391, 392, 402, 412, 428, 433, 435, 436, 471, 483]
34번째 과정: [34, 38, 57, 63, 64, 65, 81, 82, 83, 83, 94, 103, 122, 123, 150, 153, 157, 176, 184, 196, 204, 223, 234, 248, 255, 256, 258, 266, 284, 290, 293, 293, 298, 299, 303, 324, 333, 355, 361, 362, 365, 383, 391, 392, 402, 412, 428, 433, 435, 436, 471, 483]
35번째 과정: [556, 601]
36번째 과정: [550, 556, 601]
37번째 과정: [526, 550, 556, 601]
38번째 과정: [623, 656]
39번째 과정: [623, 656, 657, 659]
40번째 과정: [666, 669]
41번째 과정: [666, 669, 676]
42번째 과정: [661, 666, 669, 676]
43번째 과정: [623, 656, 657, 659, 659, 661, 666, 669, 676]
44번째 과정: [526, 550, 556, 601, 612, 623, 656, 657, 659, 659, 661, 666, 669, 676]
45번째 과정: [514, 526, 550, 556, 601, 612, 623, 656, 657, 659, 659, 661, 666, 669, 676]
46번째 과정: [514, 526, 550, 556, 601, 612, 623, 656, 657, 659, 659, 661, 666, 669, 676, 681, 694]
47번째 과정: [708, 710, 732]
48번째 과정: [708, 710, 732, 750]
49번째 과정: [789, 813]
50번째 과정: [845, 851]
51번째 과정: [836, 838, 845, 851]
52번째 과정: [789, 813, 830, 836, 838, 845, 851]
53번째 과정: [789, 813, 830, 836, 838, 845, 851, 860]
54번째 과정: [890, 902]
55번째 과정: [871, 882, 890, 902]
56번째 과정: [789, 813, 830, 836, 838, 845, 851, 860, 863, 871, 882, 890, 902]
57번째 과정: [943, 969]
58번째 과정: [929, 943, 969]
59번째 과정: [789, 813, 830, 836, 838, 845, 851, 860, 863, 871, 882, 890, 902, 926, 929, 943, 969]
60번째 과정: [789, 813, 830, 836, 838, 845, 851, 860, 863, 871, 882, 890, 902, 926, 929, 943, 969, 977, 979]
61번째 과정: [789, 813, 830, 836, 838, 845, 851, 860, 863, 871, 882, 890, 902, 926, 929, 943, 969, 977, 979, 985, 986]
62번째 과정: [708, 710, 732, 750, 772, 789, 813, 830, 836, 838, 845, 851, 860, 863, 871, 882, 890, 902, 926, 929, 943, 969, 977, 979, 985, 986]
63번째 과정: [514, 526, 550, 556, 601, 612, 623, 656, 657, 659, 659, 661, 666, 669, 676, 681, 694, 699, 708, 710, 732, 750, 772, 789, 813, 830, 836, 838, 845, 851, 860, 863, 871, 882, 890, 902, 926, 929, 943, 969, 977, 979, 985, 986]
64번째 과정: [34, 38, 57, 63, 64, 65, 81, 82, 83, 83, 94, 103, 122, 123, 150, 153, 157, 176, 184, 196, 204, 223, 234, 248, 255, 256, 258, 266, 284, 290, 293, 293, 298, 299, 303, 324, 333, 355, 361, 362, 365, 383, 391, 392, 402, 412, 428, 433, 435, 436, 471, 483, 490, 514, 526, 550, 556, 601, 612, 623, 656, 657, 659, 659, 661, 666, 669, 676, 681, 694, 699, 708, 710, 732, 750, 772, 789, 813, 830, 836, 838, 845, 851, 860, 863, 871, 882, 890, 902, 926, 929, 943, 969, 977, 979, 985, 986]
65번째 과정: [992, 997]
66번째 과정: [34, 38, 57, 63, 64, 65, 81, 82, 83, 83, 94, 103, 122, 123, 150, 153, 157, 176, 184, 196, 204, 223, 234, 248, 255, 256, 258, 266, 284, 290, 293, 293, 298, 299, 303, 324, 333, 355, 361, 362, 365, 383, 391, 392, 402, 412, 428, 433, 435, 436, 471, 483, 490, 514, 526, 550, 556, 601, 612, 623, 656, 657, 659, 659, 661, 666, 669, 676, 681, 694, 699, 708, 710, 732, 750, 772, 789, 813, 830, 836, 838, 845, 851, 860, 863, 871, 882, 890, 902, 926, 929, 943, 969, 977, 979, 985, 986, 989, 992, 997]

Execution Image