1
1
"""
2
- Introspective Sort is hybrid sort (Quick Sort + Heap Sort + Insertion Sort)
2
+ Introspective Sort is a hybrid sort (Quick Sort + Heap Sort + Insertion Sort)
3
3
if the size of the list is under 16, use insertion sort
4
4
https://en.wikipedia.org/wiki/Introsort
5
5
"""
9
9
def insertion_sort (array : list , start : int = 0 , end : int = 0 ) -> list :
10
10
"""
11
11
>>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]
12
-
13
12
>>> insertion_sort(array, 0, len(array))
14
13
[1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79]
15
14
"""
@@ -27,8 +26,7 @@ def insertion_sort(array: list, start: int = 0, end: int = 0) -> list:
27
26
def heapify (array : list , index : int , heap_size : int ) -> None : # Max Heap
28
27
"""
29
28
>>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]
30
-
31
- >>> heapify(array, len(array) // 2 ,len(array))
29
+ >>> heapify(array, len(array) // 2 , len(array))
32
30
"""
33
31
largest = index
34
32
left_index = 2 * index + 1 # Left Node
@@ -47,9 +45,7 @@ def heapify(array: list, index: int, heap_size: int) -> None: # Max Heap
47
45
48
46
def heap_sort (array : list ) -> list :
49
47
"""
50
- >>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]
51
-
52
- >>> heap_sort(array)
48
+ >>> heap_sort([4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12])
53
49
[1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79]
54
50
"""
55
51
n = len (array )
@@ -69,18 +65,13 @@ def median_of_3(
69
65
) -> int :
70
66
"""
71
67
>>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]
72
-
73
- >>> median_of_3(array, 0, 0 + ((len(array) - 0) // 2) + 1, len(array) - 1)
68
+ >>> median_of_3(array, 0, ((len(array) - 0) // 2) + 1, len(array) - 1)
74
69
12
75
-
76
70
>>> array = [13, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]
77
-
78
- >>> median_of_3(array, 0, 0 + ((len(array) - 0) // 2) + 1, len(array) - 1)
71
+ >>> median_of_3(array, 0, ((len(array) - 0) // 2) + 1, len(array) - 1)
79
72
13
80
-
81
73
>>> array = [4, 2, 6, 8, 1, 7, 8, 22, 15, 14, 27, 79, 23, 45, 14, 16]
82
-
83
- >>> median_of_3(array, 0, 0 + ((len(array) - 0) // 2) + 1, len(array) - 1)
74
+ >>> median_of_3(array, 0, ((len(array) - 0) // 2) + 1, len(array) - 1)
84
75
14
85
76
"""
86
77
if (array [first_index ] > array [middle_index ]) != (
@@ -98,7 +89,6 @@ def median_of_3(
98
89
def partition (array : list , low : int , high : int , pivot : int ) -> int :
99
90
"""
100
91
>>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]
101
-
102
92
>>> partition(array, 0, len(array), 12)
103
93
8
104
94
"""
@@ -125,22 +115,16 @@ def sort(array: list) -> list:
125
115
Examples:
126
116
>>> sort([4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12])
127
117
[1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79]
128
-
129
118
>>> sort([-1, -5, -3, -13, -44])
130
119
[-44, -13, -5, -3, -1]
131
-
132
120
>>> sort([])
133
121
[]
134
-
135
122
>>> sort([5])
136
123
[5]
137
-
138
124
>>> sort([-3, 0, -7, 6, 23, -34])
139
125
[-34, -7, -3, 0, 6, 23]
140
-
141
126
>>> sort([1.7, 1.0, 3.3, 2.1, 0.3 ])
142
127
[0.3, 1.0, 1.7, 2.1, 3.3]
143
-
144
128
>>> sort(['d', 'a', 'b', 'e', 'c'])
145
129
['a', 'b', 'c', 'd', 'e']
146
130
"""
@@ -156,9 +140,7 @@ def intro_sort(
156
140
) -> list :
157
141
"""
158
142
>>> array = [4, 2, 6, 8, 1, 7, 8, 22, 14, 56, 27, 79, 23, 45, 14, 12]
159
-
160
143
>>> max_depth = 2 * math.ceil(math.log2(len(array)))
161
-
162
144
>>> intro_sort(array, 0, len(array), 16, max_depth)
163
145
[1, 2, 4, 6, 7, 8, 8, 12, 14, 14, 22, 23, 27, 45, 56, 79]
164
146
"""
@@ -177,7 +159,6 @@ def intro_sort(
177
159
import doctest
178
160
179
161
doctest .testmod ()
180
-
181
162
user_input = input ("Enter numbers separated by a comma : " ).strip ()
182
163
unsorted = [float (item ) for item in user_input .split ("," )]
183
- print (sort (unsorted ))
164
+ print (f" { sort (unsorted ) = } " )
0 commit comments