13
13
# limitations under the License.
14
14
15
15
from ._utils import core , generate , convert
16
- from ._typing import Iterable , Callable , Optional , _T , SupportsRichComparison
16
+ from ._typing import Iterable , Callable , Optional , _T , SupportsRichComparison , List
17
17
18
- def bubble (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> list :
18
+ def bubble (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> List [ _T ] :
19
19
'''
20
20
:param __iterable: iterable data.
21
21
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
22
22
:param reverse: whether to use descending order. The default is ascending order.
23
23
'''
24
- __iterable = convert (__iterable )
25
- compare = generate (__iterable , key )
24
+ __iterable : List [ _T ] = convert (__iterable )
25
+ compare : List [ _T ] = generate (__iterable , key )
26
26
for i in range (len (__iterable ) - 1 ):
27
- flag = False # early stop by adding a bool value named flag
27
+ flag : bool = False # early stop by adding a bool value named flag
28
28
for j in range (len (__iterable ) - i - 1 ):
29
29
if core (compare [j ], compare [j + 1 ], key , reverse ):
30
30
__iterable [j ], __iterable [j + 1 ] = __iterable [j + 1 ], __iterable [j ]
31
- flag = True
31
+ flag : bool = True
32
32
if key != None :
33
33
compare [j ], compare [j + 1 ] = compare [j + 1 ], compare [j ]
34
34
if not flag :
35
35
break
36
36
return __iterable
37
37
38
- def insert (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> list :
38
+ def insert (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> List [ _T ] :
39
39
'''
40
40
:param __iterable: iterable data.
41
41
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
42
42
:param reverse: whether to use descending order. The default is ascending order.
43
43
'''
44
- __iterable = convert (__iterable )
45
- compare = generate (__iterable , key )
44
+ __iterable : List [ _T ] = convert (__iterable )
45
+ compare : List [ _T ] = generate (__iterable , key )
46
46
for index in range (1 , len (__iterable )):
47
- keyc , keya = compare [index ], __iterable [index ]
48
- low , high = 0 , index - 1
47
+ keyc : _T = compare [index ]
48
+ keya : _T = __iterable [index ]
49
+ low : int = 0
50
+ high : int = index - 1
49
51
while low <= high : # sequence conforming to monotonicity
50
- mid = (low + high ) // 2
52
+ mid : int = (low + high ) // 2
51
53
if core (keyc , compare [mid ], key , reverse ):
52
54
low = mid + 1
53
55
else :
@@ -61,57 +63,57 @@ def insert(__iterable: Iterable[_T], key: Optional[Callable[[_T], SupportsRichCo
61
63
compare [low ] = keyc
62
64
return __iterable
63
65
64
- def shell (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> list :
66
+ def shell (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> List [ _T ] :
65
67
'''
66
68
:param __iterable: iterable data.
67
69
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
68
70
:param reverse: whether to use descending order. The default is ascending order.
69
71
'''
70
- __iterable = convert (__iterable )
71
- compare = generate (__iterable , key )
72
- length = len (__iterable )
73
- gap = 1
72
+ __iterable : List [ _T ] = convert (__iterable )
73
+ compare : List [ _T ] = generate (__iterable , key )
74
+ length : int = len (__iterable )
75
+ gap : int = 1
74
76
while gap < length / 3 :
75
- gap = int (3 * gap + 1 )
77
+ gap : int = int (3 * gap + 1 )
76
78
while gap >= 1 :
77
79
for index in range (gap , length ):
78
- next = index
80
+ next : int = index
79
81
while next >= gap and core (compare [next - gap ], compare [next ], key , reverse ):
80
82
__iterable [next ], __iterable [next - gap ] = __iterable [next - gap ], __iterable [next ]
81
83
if key != None :
82
84
compare [next ], compare [next - gap ] = compare [next - gap ], compare [next ]
83
85
next -= gap
84
- gap = int (gap / 3 )
86
+ gap : int = int (gap / 3 )
85
87
return __iterable
86
88
87
89
88
- def heap (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> list :
90
+ def heap (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> List [ _T ] :
89
91
'''
90
92
:param __iterable: iterable data.
91
93
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
92
94
:param reverse: whether to use descending order. The default is ascending order.
93
95
'''
94
- __iterable = convert (__iterable )
95
- compare = generate (__iterable , key )
96
+ __iterable : List [ _T ] = convert (__iterable )
97
+ compare : List [ _T ] = generate (__iterable , key )
96
98
def build (root : int , end : int ) -> None :
97
99
'''
98
100
:param root: cursor indicating the root node (int).
99
101
:param end: cursor indicating the end of the __iterable (int).
100
102
'''
101
- piv = root
102
- left = 2 * root + 1
103
- right = 2 * root + 2
103
+ piv : int = root
104
+ left : int = 2 * root + 1
105
+ right : int = 2 * root + 2
104
106
if left < end and core (compare [left ], compare [root ], key , reverse ):
105
- piv = left
107
+ piv : int = left
106
108
if right < end and core (compare [right ], compare [piv ], key , reverse ):
107
- piv = right
109
+ piv : int = right
108
110
if piv != root :
109
111
__iterable [root ], __iterable [piv ] = __iterable [piv ], __iterable [root ]
110
112
if key != None :
111
113
compare [root ], compare [piv ] = compare [piv ], compare [root ]
112
114
build (piv , end )
113
115
114
- length = len (__iterable )
116
+ length : int = len (__iterable )
115
117
for root in range (length // 2 - 1 , - 1 , - 1 ):
116
118
build (root , length )
117
119
for end in range (length - 1 , 0 , - 1 ):
@@ -121,20 +123,20 @@ def build(root: int, end: int) -> None:
121
123
build (0 , end )
122
124
return __iterable
123
125
124
- def quick (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> list :
126
+ def quick (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> List [ _T ] :
125
127
'''
126
128
:param __iterable: iterable data.
127
129
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
128
130
:param reverse: whether to use descending order. The default is ascending order.
129
131
'''
130
- __iterable = convert (__iterable )
131
- compare = generate (__iterable , key )
132
+ __iterable : List [ _T ] = convert (__iterable )
133
+ compare : List [ _T ] = generate (__iterable , key )
132
134
def solve (l : int , r : int ) -> None :
133
135
'''
134
136
main
135
137
'''
136
138
if l < r :
137
- mid = partition (l , r )
139
+ mid : int = partition (l , r )
138
140
solve (l , mid - 1 )
139
141
solve (mid + 1 , r )
140
142
@@ -143,8 +145,8 @@ def partition(l: int, r: int) -> int:
143
145
:param l: The left cursor of __iterable (int).
144
146
:param r: The right cursor of __iterable (int).
145
147
'''
146
- val = compare [r ]
147
- index = l - 1
148
+ val : _T = compare [r ]
149
+ index : int = l - 1
148
150
for ind in range (l , r ):
149
151
if core (val , compare [ind ], key , reverse ):
150
152
index += 1
@@ -155,28 +157,31 @@ def partition(l: int, r: int) -> int:
155
157
if key != None :
156
158
compare [index + 1 ], compare [r ] = compare [r ], compare [index + 1 ]
157
159
return index + 1
158
- solve (0 , len (__iterable )- 1 )
160
+ solve (0 , len (__iterable ) - 1 )
159
161
return __iterable
160
162
161
- def merge (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> list :
163
+ def merge (__iterable : Iterable [_T ], key : Optional [Callable [[_T ], SupportsRichComparison ]]= None , reverse : bool = False ) -> List [ _T ] :
162
164
'''
163
165
:param __iterable: iterable data.
164
166
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
165
167
:param reverse: whether to use descending order. The default is ascending order.
166
168
'''
167
- __iterable = convert (__iterable )
168
- compare = generate (__iterable , key )
169
+ __iterable : List [ _T ] = convert (__iterable )
170
+ compare : List [ _T ] = generate (__iterable , key )
169
171
def merg (low : int , mid : int , high : int ) -> None :
170
172
'''
171
173
:param low: The low-side cursor of __iterable (int).
172
174
:param mid: The middle-side cursor of __iterable (int).
173
175
:param high: The high-side cursor of __iterable (int).
174
176
'''
175
- left , lc = __iterable [low : mid ], compare [low : mid ]
176
- right , rc = __iterable [mid : high ], compare [mid : high ]
177
- i = 0
178
- j = 0
179
- result , store = [], []
177
+ left : Iterable [_T ] = __iterable [low : mid ]
178
+ lc : List [_T ] = compare [low : mid ]
179
+ right : Iterable [_T ] = __iterable [mid : high ]
180
+ rc : List [_T ] = compare [mid : high ]
181
+ i : int = 0
182
+ j : int = 0
183
+ result : List [_T ] = []
184
+ store : List [_T ] = []
180
185
while i < len (left ) and j < len (right ):
181
186
if core (rc [j ], lc [i ], key , reverse ):
182
187
result .append (left [i ])
@@ -190,19 +195,19 @@ def merg(low: int, mid: int, high: int) -> None:
190
195
store += lc [i :]
191
196
result += right [j :]
192
197
store += rc [j :]
193
- __iterable [low : high ] = result
194
- compare [low : high ] = store
198
+ __iterable [low : high ]: List [ _T ] = result
199
+ compare [low : high ]: List [ _T ] = store
195
200
196
201
def solve () -> None :
197
202
'''
198
203
main
199
204
'''
200
- i = 1
205
+ i : int = 1
201
206
while i < len (__iterable ):
202
- low = 0
207
+ low : int = 0
203
208
while low < len (__iterable ):
204
- mid = low + i
205
- high = min (low + 2 * i , len (__iterable ))
209
+ mid : int = low + i
210
+ high : int = min (low + 2 * i , len (__iterable ))
206
211
if mid < high :
207
212
merg (low , mid , high )
208
213
low += 2 * i
0 commit comments