Skip to content

Commit 9d5f9ac

Browse files
committed
renew project
1 parent 8917fb6 commit 9d5f9ac

File tree

5 files changed

+69
-59
lines changed

5 files changed

+69
-59
lines changed

README_release.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
|v1.1.0|`pip install sortingx==1.1.0`|Write in Python with Typing||
88
|v1.1.1|`pip install sortingx==1.1.1`|Complete Typing and Accelerate||
99
|v1.1.2|`pip install sortingx==1.1.2`|Support More Iterative Data Types||
10+
|v1.1.3|`pip install sortingx==1.1.3`|Typing Check with More Local Variables||
1011
|v2.0.0|`pip install sortingx==2.0.0`|Rely on Cython||
1112
|v3.0.0|`pip install sortingx==3.0.0`|Restuct with C++||
1213
|v4.0.0|`pip install sortingx==4.0.0`|Rust with PyO3||

sortingx/_typing.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
Optional,
2020
Protocol,
2121
TypeVar,
22-
Union
22+
Union,
23+
List
2324
)
2425

2526
from typing_extensions import (

sortingx/_utils.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from ._typing import Iterable, Callable, Optional, _T, SupportsRichComparison
15+
from ._typing import Iterable, List, Callable, Optional, _T, SupportsRichComparison
1616

17-
def generate(__iterable: Iterable[_T], key: Optional[Callable[[_T], SupportsRichComparison]]=None) -> list:
18-
compare = list(map(key, __iterable)) if key != None else __iterable
19-
compare = ([[value] for value in compare] if (compare and not isinstance(compare[0], Iterable)) else compare) if key != None else __iterable
17+
# Data Generated by Mapping.
18+
def generate(__iterable: List[_T], key: Optional[Callable[[_T], SupportsRichComparison]]=None) -> List[_T]:
19+
compare: List[_T] = list(map(key, __iterable)) if key != None else __iterable
20+
compare: List[_T] = ([[value] for value in compare] if (compare and not isinstance(compare[0], Iterable)) else compare) if key != None else __iterable
2021
return compare
2122

22-
def core(left: Iterable[_T], right: Iterable[_T], key: Optional[Callable[[_T], SupportsRichComparison]]=None, reverse: bool=False) -> bool:
23+
# Redefined Comparison Rules: A High-Speed State Selection Function.
24+
def core(left: List[_T], right: List[_T], key: Optional[Callable[[_T], SupportsRichComparison]]=None, reverse: bool=False) -> bool:
2325
if key == None:
2426
return left < right if reverse else left > right
2527
for index in range(0, len(left)):
@@ -31,9 +33,10 @@ def core(left: Iterable[_T], right: Iterable[_T], key: Optional[Callable[[_T], S
3133
return True
3234
elif left[index] < right[index] and not reverse:
3335
return False
34-
return False
36+
return False # Reduce the Times of Data Exchanging.
3537

36-
def convert(__iterable: Iterable[_T]) -> list:
38+
# Uniformly Convert `Iterable` into `List`: Facilitate the Execution of Sorting Algorithms.
39+
def convert(__iterable: Iterable[_T]) -> List[_T]:
3740
if isinstance(__iterable, (tuple, str, set, dict)):
3841
return list(__iterable)
3942
return __iterable

sortingx/sorting.py

Lines changed: 55 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -13,41 +13,43 @@
1313
# limitations under the License.
1414

1515
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
1717

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]:
1919
'''
2020
:param __iterable: iterable data.
2121
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
2222
:param reverse: whether to use descending order. The default is ascending order.
2323
'''
24-
__iterable = convert(__iterable)
25-
compare = generate(__iterable, key)
24+
__iterable: List[_T] = convert(__iterable)
25+
compare: List[_T] = generate(__iterable, key)
2626
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
2828
for j in range(len(__iterable) - i - 1):
2929
if core(compare[j], compare[j + 1], key, reverse):
3030
__iterable[j], __iterable[j + 1] = __iterable[j + 1], __iterable[j]
31-
flag = True
31+
flag: bool = True
3232
if key != None:
3333
compare[j], compare[j + 1] = compare[j + 1], compare[j]
3434
if not flag:
3535
break
3636
return __iterable
3737

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]:
3939
'''
4040
:param __iterable: iterable data.
4141
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
4242
:param reverse: whether to use descending order. The default is ascending order.
4343
'''
44-
__iterable = convert(__iterable)
45-
compare = generate(__iterable, key)
44+
__iterable: List[_T] = convert(__iterable)
45+
compare: List[_T] = generate(__iterable, key)
4646
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
4951
while low <= high: # sequence conforming to monotonicity
50-
mid = (low + high) // 2
52+
mid: int = (low + high) // 2
5153
if core(keyc, compare[mid], key, reverse):
5254
low = mid + 1
5355
else:
@@ -61,57 +63,57 @@ def insert(__iterable: Iterable[_T], key: Optional[Callable[[_T], SupportsRichCo
6163
compare[low] = keyc
6264
return __iterable
6365

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]:
6567
'''
6668
:param __iterable: iterable data.
6769
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
6870
:param reverse: whether to use descending order. The default is ascending order.
6971
'''
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
7476
while gap < length / 3:
75-
gap = int(3 * gap + 1)
77+
gap: int = int(3 * gap + 1)
7678
while gap >= 1:
7779
for index in range(gap, length):
78-
next = index
80+
next: int = index
7981
while next >= gap and core(compare[next - gap], compare[next], key, reverse):
8082
__iterable[next], __iterable[next - gap] = __iterable[next - gap], __iterable[next]
8183
if key != None:
8284
compare[next], compare[next - gap] = compare[next - gap], compare[next]
8385
next -= gap
84-
gap = int(gap / 3)
86+
gap: int = int(gap / 3)
8587
return __iterable
8688

8789

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]:
8991
'''
9092
:param __iterable: iterable data.
9193
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
9294
:param reverse: whether to use descending order. The default is ascending order.
9395
'''
94-
__iterable = convert(__iterable)
95-
compare = generate(__iterable, key)
96+
__iterable: List[_T] = convert(__iterable)
97+
compare: List[_T] = generate(__iterable, key)
9698
def build(root: int, end: int) -> None:
9799
'''
98100
:param root: cursor indicating the root node (int).
99101
:param end: cursor indicating the end of the __iterable (int).
100102
'''
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
104106
if left < end and core(compare[left], compare[root], key, reverse):
105-
piv = left
107+
piv: int = left
106108
if right < end and core(compare[right], compare[piv], key, reverse):
107-
piv = right
109+
piv: int = right
108110
if piv != root:
109111
__iterable[root], __iterable[piv] = __iterable[piv], __iterable[root]
110112
if key != None:
111113
compare[root], compare[piv] = compare[piv], compare[root]
112114
build(piv, end)
113115

114-
length = len(__iterable)
116+
length: int = len(__iterable)
115117
for root in range(length // 2 - 1 , -1, -1):
116118
build(root, length)
117119
for end in range(length - 1, 0, -1):
@@ -121,20 +123,20 @@ def build(root: int, end: int) -> None:
121123
build(0, end)
122124
return __iterable
123125

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]:
125127
'''
126128
:param __iterable: iterable data.
127129
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
128130
:param reverse: whether to use descending order. The default is ascending order.
129131
'''
130-
__iterable = convert(__iterable)
131-
compare = generate(__iterable, key)
132+
__iterable: List[_T] = convert(__iterable)
133+
compare: List[_T] = generate(__iterable, key)
132134
def solve(l: int, r: int) -> None:
133135
'''
134136
main
135137
'''
136138
if l < r:
137-
mid = partition(l, r)
139+
mid: int = partition(l, r)
138140
solve(l, mid - 1)
139141
solve(mid + 1, r)
140142

@@ -143,8 +145,8 @@ def partition(l: int, r: int) -> int:
143145
:param l: The left cursor of __iterable (int).
144146
:param r: The right cursor of __iterable (int).
145147
'''
146-
val = compare[r]
147-
index = l - 1
148+
val: _T = compare[r]
149+
index: int = l - 1
148150
for ind in range(l, r):
149151
if core(val, compare[ind], key, reverse):
150152
index += 1
@@ -155,28 +157,31 @@ def partition(l: int, r: int) -> int:
155157
if key != None:
156158
compare[index + 1], compare[r] = compare[r], compare[index + 1]
157159
return index + 1
158-
solve(0, len(__iterable)-1)
160+
solve(0, len(__iterable) - 1)
159161
return __iterable
160162

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]:
162164
'''
163165
:param __iterable: iterable data.
164166
:param key: callable function, for example: key=lambda x: x[1], key=lambda x: (x[0], x[1]).
165167
:param reverse: whether to use descending order. The default is ascending order.
166168
'''
167-
__iterable = convert(__iterable)
168-
compare = generate(__iterable, key)
169+
__iterable: List[_T] = convert(__iterable)
170+
compare: List[_T] = generate(__iterable, key)
169171
def merg(low: int, mid: int, high: int) -> None:
170172
'''
171173
:param low: The low-side cursor of __iterable (int).
172174
:param mid: The middle-side cursor of __iterable (int).
173175
:param high: The high-side cursor of __iterable (int).
174176
'''
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] = []
180185
while i < len(left) and j < len(right):
181186
if core(rc[j], lc[i], key, reverse):
182187
result.append(left[i])
@@ -190,19 +195,19 @@ def merg(low: int, mid: int, high: int) -> None:
190195
store += lc[i:]
191196
result += right[j:]
192197
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
195200

196201
def solve() -> None:
197202
'''
198203
main
199204
'''
200-
i = 1
205+
i: int = 1
201206
while i < len(__iterable):
202-
low = 0
207+
low: int = 0
203208
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))
206211
if mid < high:
207212
merg(low, mid, high)
208213
low += 2 * i

test_typing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
data = {'Alex': 100, 'Jack': 97, 'Peter': 88, 'Li': 98}
44
print(type(data))
55
test = sorted(data, reverse=True)
6-
output = six.bubble(data, reverse=True)
6+
output = six.merge(data, reverse=True)
77
print(output, '\n', output == test)

0 commit comments

Comments
 (0)