mlymath 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
mlymath-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.2
2
+ Name: mlymath
3
+ Version: 0.1.0
4
+ Author: mly
5
+ Classifier: Programming Language :: Python :: 3
6
+ Classifier: License :: OSI Approved :: MIT License
7
+ Classifier: Operating System :: OS Independent
8
+ Requires-Python: >=3.6
9
+ Dynamic: author
10
+ Dynamic: classifier
11
+ Dynamic: requires-python
File without changes
@@ -0,0 +1,63 @@
1
+ from .math import (
2
+ sha3_256,
3
+ sha3_512,
4
+ sha256,
5
+ gcd,
6
+ lcm,
7
+ is_prime,
8
+ comb,
9
+ pow,
10
+ fib_list,
11
+ fib,
12
+ pell_list,
13
+ pell,
14
+ factor,
15
+ manhattan_d,
16
+ euclidean_d,
17
+ matrix_add,
18
+ matrix_sub,
19
+ matrix_mul,
20
+ matrix_scalar_mul,
21
+ matrix_transpose,
22
+ list_max,
23
+ max,
24
+ list_min,
25
+ min,
26
+ list_max_index,
27
+ max_index,
28
+ list_min_index,
29
+ min_index,
30
+ math_help
31
+ )
32
+
33
+ __all__ = [
34
+ 'sha3_256',
35
+ 'sha3_512',
36
+ 'sha256',
37
+ 'gcd',
38
+ 'lcm',
39
+ 'is_prime',
40
+ 'comb',
41
+ 'pow',
42
+ 'fib_list',
43
+ 'fib',
44
+ 'pell_list',
45
+ 'pell',
46
+ 'factor',
47
+ 'manhattan_d',
48
+ 'euclidean_d',
49
+ 'matrix_add',
50
+ 'matrix_sub',
51
+ 'matrix_mul',
52
+ 'matrix_transpose',
53
+ 'matrix_scalar_mul',
54
+ 'list_max',
55
+ 'max',
56
+ 'list_min',
57
+ 'min',
58
+ 'list_max_index',
59
+ 'max_index',
60
+ 'list_min_index',
61
+ 'min_index',
62
+ 'math_help'
63
+ ]
@@ -0,0 +1,383 @@
1
+ import hashlib # 新增:用于 SHA-256 加密
2
+
3
+ def sha3_256(input_string: str) -> str:
4
+ """
5
+ 使用 SHA3-256 算法加密字符串。
6
+ :param input_string: 待加密的字符串
7
+ :return: 加密后的十六进制字符串
8
+ """
9
+ sha3_256_hash = hashlib.sha3_256(input_string.encode()).hexdigest()
10
+ return sha3_256_hash
11
+
12
+ def sha3_512(input_string: str) -> str:
13
+ """
14
+ 使用 SHA3-512 算法加密字符串。
15
+ :param input_string: 待加密的字符串
16
+ :return: 加密后的十六进制字符串
17
+ """
18
+ sha3_512_hash = hashlib.sha3_512(input_string.encode()).hexdigest()
19
+ return sha3_512_hash
20
+
21
+
22
+ def sha256(input_string: str) -> str:
23
+ """
24
+ 使用 SHA-256 算法加密字符串。
25
+ :param input_string: 待加密的字符串
26
+ :return: 加密后的十六进制字符串
27
+ """
28
+ sha256_hash = hashlib.sha256(input_string.encode()).hexdigest()
29
+ return sha256_hash
30
+
31
+
32
+ def gcd(*nums: int) -> int:
33
+ """优化后:移除冗余操作"""
34
+ from math import gcd as _gcd # 模块级导入(关键)
35
+ current_gcd = nums[0]
36
+ for num in nums[1:]:
37
+ current_gcd = _gcd(current_gcd, num)
38
+ if current_gcd == 1:
39
+ break
40
+ return current_gcd # 移除 abs(math.gcd 已返回非负数)
41
+
42
+ def lcm(*nums: int) -> int:
43
+ """优化后:恢复 `0 in nums` 检查"""
44
+ if 0 in nums: # 更高效的零检查
45
+ return 0
46
+ current_lcm = 1
47
+ for num in nums:
48
+ current_lcm = current_lcm * num // gcd(current_lcm, num)
49
+ return current_lcm
50
+
51
+ def is_prime(n):
52
+ if n < 2:
53
+ return False
54
+ if n in (2, 3):
55
+ return True
56
+ if n % 2 == 0 or n % 3 == 0:
57
+ return False
58
+ i = 5
59
+ w = 2
60
+ while i * i <= n:
61
+ if n % i == 0:
62
+ return False
63
+ i += w
64
+ w = 6 - w # 在2和4之间切换,实现步长6的检查
65
+ return True
66
+
67
+ def comb(n: int, k: int) -> int:
68
+ """计算组合数 C(n, k)"""
69
+ if k < 0 or k > n:
70
+ return 0
71
+ if k == 0 or k == n:
72
+ return 1
73
+ # 使用动态规划优化组合数计算
74
+ dp = [0] * (k + 1)
75
+ dp[0] = 1
76
+ for i in range(1, n + 1):
77
+ for j in range(min(i, k), 0, -1):
78
+ dp[j] += dp[j - 1]
79
+ return dp[k]
80
+
81
+ def pow(x, y):
82
+ """
83
+ 快速计算 x 的 y 次幂。
84
+ :param x: 底数,可以是整数或浮点数
85
+ :param y: 指数,可以是正数、负数或零
86
+ :return: 计算结果
87
+ """
88
+ if y == 0:
89
+ return 1 # 任何数的0次幂为1
90
+ if y < 0:
91
+ x = 1 / x # 处理负指数
92
+ y = -y
93
+ result = 1
94
+ while y > 0:
95
+ if y % 2 == 1: # 如果指数为奇数
96
+ result *= x
97
+ x *= x # 底数平方
98
+ y //= 2 # 指数减半
99
+ return result
100
+
101
+ def fib_list(n: int) -> list:
102
+ """
103
+ 生成包含前 N 项的斐波那契数列。
104
+ :param n: 数列的项数(必须为正整数)
105
+ :return: 包含前 N 项斐波那契数列的列表
106
+ """
107
+ if n <= 0:
108
+ raise ValueError("输入必须为正整数")
109
+ sequence = [0, 1]
110
+ for _ in range(2, n):
111
+ sequence.append(sequence[-1] + sequence[-2])
112
+ return sequence[:n]
113
+
114
+ def fib(n: int) -> int:
115
+ """
116
+ 返回第 N 项的斐波那契数。
117
+ :param n: 第 N 项(必须为正整数)
118
+ :return: 第 N 项的斐波那契数
119
+ """
120
+ if n <= 0:
121
+ raise ValueError("输入必须为正整数")
122
+ a, b = 0, 1
123
+ for _ in range(1, n):
124
+ a, b = b, a + b
125
+ return a
126
+
127
+ def pell_list(n: int) -> list:
128
+ """
129
+ 生成包含前 N 项的佩尔数列。
130
+ :param n: 数列的项数(必须为正整数)
131
+ :return: 包含前 N 项佩尔数列的列表
132
+ """
133
+ if n <= 0:
134
+ raise ValueError("输入必须为正整数")
135
+ sequence = [0, 1]
136
+ for _ in range(2, n):
137
+ sequence.append(2 * sequence[-1] + sequence[-2])
138
+ return sequence[:n]
139
+
140
+ def pell(n: int) -> int:
141
+ """
142
+ 返回第 N 项的佩尔数。
143
+ :param n: 第 N 项(必须为正整数)
144
+ :return: 第 N 项的佩尔数
145
+ """
146
+ if n <= 0:
147
+ raise ValueError("输入必须为正整数")
148
+ a, b = 0, 1
149
+ for _ in range(1, n):
150
+ a, b = b, 2 * b + a
151
+ return a
152
+
153
+ def factor(n: int) -> list:
154
+ """
155
+ 分解整数 n 的质因数。
156
+ :param n: 待分解的整数(必须为正整数)
157
+ :return: 包含所有质因数的列表
158
+ """
159
+ if n <= 0:
160
+ raise ValueError("输入必须为正整数")
161
+ factors = []
162
+ # 处理2的因子
163
+ while n % 2 == 0:
164
+ factors.append(2)
165
+ n //= 2
166
+ # 处理奇数因子
167
+ i = 3
168
+ while i * i <= n:
169
+ while n % i == 0:
170
+ factors.append(i)
171
+ n //= i
172
+ i += 2
173
+ # 如果剩余的 n 是质数
174
+ if n > 1:
175
+ factors.append(n)
176
+ return factors
177
+
178
+ def manhattan_d(point1, point2):
179
+ """
180
+ 计算两个点之间的曼哈顿距离。
181
+ :param point1: 第一个点的坐标 (list 或 tuple)
182
+ :param point2: 第二个点的坐标 (list 或 tuple)
183
+ :return: 曼哈顿距离
184
+ """
185
+ if len(point1) != len(point2):
186
+ raise ValueError("两个点的维度必须相同")
187
+ return sum(abs(a - b) for a, b in zip(point1, point2))
188
+
189
+ def euclidean_d(point1, point2, precision=None):
190
+ """
191
+ 计算两个点之间的欧几里得距离。
192
+ :param point1: 第一个点的坐标 (list 或 tuple)
193
+ :param point2: 第二个点的坐标 (list 或 tuple)
194
+ :param precision: 可选参数,指定结果保留的小数位数
195
+ :return: 欧几里得距离
196
+ """
197
+ if len(point1) != len(point2):
198
+ raise ValueError("两个点的维度必须相同")
199
+ distance = (sum((a - b) ** 2 for a, b in zip(point1, point2))) ** 0.5
200
+ return round(distance, precision) if precision is not None else distance
201
+
202
+ def matrix_add(matrix1, matrix2):
203
+ """
204
+ 计算两个矩阵的加法。
205
+ :param matrix1: 第一个矩阵 (二维列表)
206
+ :param matrix2: 第二个矩阵 (二维列表)
207
+ :return: 相加后的矩阵 (二维列表)
208
+ """
209
+ if len(matrix1) != len(matrix2) or any(len(row1) != len(row2) for row1, row2 in zip(matrix1, matrix2)):
210
+ raise ValueError("两个矩阵的维度必须相同")
211
+ return [[a + b for a, b in zip(row1, row2)] for row1, row2 in zip(matrix1, matrix2)]
212
+
213
+ def matrix_sub(matrix1, matrix2):
214
+ """
215
+ 计算两个矩阵的减法。
216
+ :param matrix1: 第一个矩阵 (二维列表)
217
+ :param matrix2: 第二个矩阵 (二维列表)
218
+ :return: 相减后的矩阵 (二维列表)
219
+ """
220
+ if len(matrix1) != len(matrix2) or any(len(row1) != len(row2) for row1, row2 in zip(matrix1, matrix2)):
221
+ raise ValueError("两个矩阵的维度必须相同")
222
+ return [[a - b for a, b in zip(row1, row2)] for row1, row2 in zip(matrix1, matrix2)]
223
+
224
+ def matrix_mul(matrix1, matrix2):
225
+ """
226
+ 计算两个矩阵的乘法。
227
+ :param matrix1: 第一个矩阵 (二维列表)
228
+ :param matrix2: 第二个矩阵 (二维列表)
229
+ :return: 相乘后的矩阵 (二维列表)
230
+ """
231
+ if len(matrix1[0]) != len(matrix2):
232
+ raise ValueError("第一个矩阵的列数必须等于第二个矩阵的行数")
233
+ result = [[0 for _ in range(len(matrix2[0]))] for _ in range(len(matrix1))]
234
+ for i in range(len(matrix1)):
235
+ for j in range(len(matrix2[0])):
236
+ for k in range(len(matrix2)):
237
+ result[i][j] += matrix1[i][k] * matrix2[k][j]
238
+ return result
239
+
240
+ def matrix_transpose(matrix):
241
+ """
242
+ 计算矩阵的转置。
243
+ :param matrix: 输入矩阵 (二维列表)
244
+ :return: 转置后的矩阵 (二维列表)
245
+ """
246
+ return [list(row) for row in zip(*matrix)]
247
+
248
+ def matrix_scalar_mul(matrix, scalar):
249
+ """
250
+ 计算矩阵与标量的乘法。
251
+ :param matrix: 输入矩阵 (二维列表)
252
+ :param scalar: 标量值 (整数或浮点数)
253
+ :return: 乘法结果矩阵 (二维列表)
254
+ """
255
+ return [[scalar * element for element in row] for row in matrix]
256
+
257
+ def list_max(nums, n):
258
+ """
259
+ 找到数组中第 N 大的数。
260
+ :param nums: 输入的数组 (list)
261
+ :param n: 第 N 大的数 (int)
262
+ :return: 第 N 大的数
263
+ """
264
+ if not (1 <= n <= len(nums)):
265
+ raise ValueError("N 必须在 1 到数组长度之间")
266
+ return sorted(nums, reverse=True)[n - 1]
267
+
268
+ def max(*nums, n):
269
+ """
270
+ 找到多个数中第 N 大的数。
271
+ :param nums: 输入的多个数
272
+ :param n: 第 N 大的数 (int)
273
+ :return: 第 N 大的数
274
+ """
275
+ # 修改:将 *nums 转换为列表以统一处理
276
+ nums = list(nums)
277
+ if not (1 <= n <= len(nums)):
278
+ raise ValueError("N 必须在 1 到输入数的个数之间")
279
+ return sorted(nums, reverse=True)[n - 1]
280
+
281
+ def list_max_index(nums, n):
282
+ """
283
+ 找到数组中第 N 大的数的索引。
284
+ :param nums: 输入的数组 (list)
285
+ :param n: 第 N 大的数 (int)
286
+ :return: 第 N 大的数的索引
287
+ """
288
+ if not (1 <= n <= len(nums)):
289
+ raise ValueError("N 必须在 1 到数组长度之间")
290
+ sorted_indices = sorted(range(len(nums)), key=lambda i: nums[i], reverse=True)
291
+ return sorted_indices[n - 1]
292
+
293
+ def max_index(*nums, n):
294
+ """
295
+ 找到多个数中第 N 大的数的索引。
296
+ :param nums: 输入的多个数
297
+ :param n: 第 N 大的数 (int)
298
+ :return: 第 N 大的数的索引
299
+ """
300
+ if not (1 <= n <= len(nums)):
301
+ raise ValueError("N 必须在 1 到输入数的个数之间")
302
+ sorted_indices = sorted(range(len(nums)), key=lambda i: nums[i], reverse=True)
303
+ return sorted_indices[n - 1]
304
+
305
+ def list_min(nums, n):
306
+ """
307
+ 找到数组中第 N 小的数。
308
+ :param nums: 输入的数组 (list)
309
+ :param n: 第 N 小的数 (int)
310
+ :return: 第 N 小的数
311
+ """
312
+ if not (1 <= n <= len(nums)):
313
+ raise ValueError("N 必须在 1 到数组长度之间")
314
+ return sorted(nums)[n - 1]
315
+
316
+ def min(*nums, n):
317
+ """
318
+ 找到多个数中第 N 小的数。
319
+ :param nums: 输入的多个数
320
+ :param n: 第 N 小的数 (int)
321
+ :return: 第 N 小的数
322
+ """
323
+ # 修改:将 *nums 转换为列表以统一处理
324
+ nums = list(nums)
325
+ if not (1 <= n <= len(nums)):
326
+ raise ValueError("N 必须在 1 到输入数的个数之间")
327
+ return sorted(nums)[n - 1]
328
+
329
+ def list_min_index(nums, n):
330
+ """
331
+ 找到数组中第 N 小的数的索引。
332
+ :param nums: 输入的数组 (list)
333
+ :param n: 第 N 小的数 (int)
334
+ :return: 第 N 小的数的索引
335
+ """
336
+ if not (1 <= n <= len(nums)):
337
+ raise ValueError("N 必须在 1 到数组长度之间")
338
+ sorted_indices = sorted(range(len(nums)), key=lambda i: nums[i])
339
+ return sorted_indices[n - 1]
340
+
341
+ def min_index(*nums, n):
342
+ """
343
+ 找到多个数中第 N 小的数的索引。
344
+ :param nums: 输入的多个数
345
+ :param n: 第 N 小的数 (int)
346
+ :return: 第 N 小的数的索引
347
+ """
348
+ if not (1 <= n <= len(nums)):
349
+ raise ValueError("N 必须在 1 到输入数的个数之间")
350
+ sorted_indices = sorted(range(len(nums)), key=lambda i: nums[i])
351
+ return sorted_indices[n - 1]
352
+
353
+ def math_help():
354
+ """提供模块帮助信息"""
355
+ print("以下是可用的函数:")
356
+ print("- gcd(*nums: int) -> int: 计算多个整数的最大公约数")
357
+ print("- lcm(*nums: int) -> int: 计算多个整数的最小公倍数")
358
+ print("- is_prime(n) -> bool: 判断一个整数是否为素数")
359
+ print("- comb(n: int, k: int) -> int: 计算组合数 C(n, k)")
360
+ print("- pow(x, y): 快速计算 x 的 y 次幂")
361
+ print("- sha256(input_string: str) -> str: 使用 SHA-256 算法加密字符串")
362
+ print("- sha3_256(input_string: str) -> str: 使用 SHA3-256 算法加密字符串")
363
+ print("- sha3_512(input_string: str) -> str: 使用 SHA3-512 算法加密字符串")
364
+ print("- fib_list(n) -> list: 生成包含前 N 项的斐波那契数列")
365
+ print("- fib(n) -> int: 返回第 N 项的斐波那契数")
366
+ print("- pell_list(n) -> list: 生成包含前 N 项的佩尔数列")
367
+ print("- pell(n) -> int: 返回第 N 项的佩尔数")
368
+ print("- factor(n: int) -> list: 分解整数 n 的质因数")
369
+ print("- manhattan_d(point1, point2): 计算两个点之间的曼哈顿距离")
370
+ print("- euclidean_d(point1, point2, precision=None): 计算两个点之间的欧几里得距离,可指定小数位数")
371
+ print("- matrix_add(matrix1, matrix2): 计算两个矩阵的加法")
372
+ print("- matrix_sub(matrix1, matrix2): 计算两个矩阵的减法")
373
+ print("- matrix_mu(matrix1, matrix2): 计算两个矩阵的乘法")
374
+ print("- matrix_transpose(matrix): 计算矩阵的转置")
375
+ print("- matrix_scalar_mul(matrix, scalar): 计算矩阵与标量的乘法")
376
+ print("- list_max(nums, n): 找到数组中第 N 大的数")
377
+ print("- max(*nums, n): 找到多个数中第 N 大的数, 输入n时请注意使用n = [num]")
378
+ print("- list_max_index(nums, n): 找到数组中第 N 大的数的索引")
379
+ print("- max_index(*nums, n): 找到多个数中第 N 大的数的索引, 输入n时请注意使用n = [num]")
380
+ print("- list_min(nums, n): 找到数组中第 N 小的数")
381
+ print("- min(*nums, n): 找到多个数中第 N 小的数, 输入n时请注意使用n = [num]")
382
+ print("- list_min_index(nums, n): 找到数组中第 N 小的数的索引")
383
+ print("- min_index(*nums, n): 找到多个数中第 N 小的数的索引, 输入n时请注意使用n = [num]")
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.2
2
+ Name: mlymath
3
+ Version: 0.1.0
4
+ Author: mly
5
+ Classifier: Programming Language :: Python :: 3
6
+ Classifier: License :: OSI Approved :: MIT License
7
+ Classifier: Operating System :: OS Independent
8
+ Requires-Python: >=3.6
9
+ Dynamic: author
10
+ Dynamic: classifier
11
+ Dynamic: requires-python
@@ -0,0 +1,12 @@
1
+ README.md
2
+ setup.py
3
+ math/__init__.py
4
+ math/math.py
5
+ mlymath.egg-info/PKG-INFO
6
+ mlymath.egg-info/SOURCES.txt
7
+ mlymath.egg-info/dependency_links.txt
8
+ mlymath.egg-info/top_level.txt
9
+ morse/__init__.py
10
+ morse/morse.py
11
+ sort/__init__.py
12
+ sort/sort.py
@@ -0,0 +1,3 @@
1
+ math
2
+ morse
3
+ sort
@@ -0,0 +1,11 @@
1
+ from .morse import (
2
+ morse,
3
+ unmorse,
4
+ morse_help
5
+ )
6
+
7
+ __all__ = [
8
+ "morse",
9
+ "unmorse",
10
+ "morse_help"
11
+ ]
@@ -0,0 +1,56 @@
1
+ # 扩展摩尔斯电码映射表
2
+ MORSE_CODE_DICT = {
3
+ 'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.',
4
+ 'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..',
5
+ 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.',
6
+ 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-',
7
+ 'Y': '-.--', 'Z': '--..', '1': '.----', '2': '..---', '3': '...--',
8
+ '4': '....-', '5': '.....', '6': '-....', '7': '--...', '8': '---..',
9
+ '9': '----.', '0': '-----', ',': '--..--', '.': '.-.-.-', '?': '..--..',
10
+ "'": '.----.', '!': '-.-.--', '/': '-..-.', '(': '-.--.', ')': '-.--.-',
11
+ '&': '.-...', ':': '---...', ';': '-.-.-.', '=': '-...-', '+': '.-.-.',
12
+ '-': '-....-', '_': '..--.-', '"': '.-..-.', '$': '...-..-', '@': '.--.-.',
13
+ 'Ä': '.-.-', 'Á': '.--.-', 'Å': '.--.-', 'Ch': '----', 'É': '..-..',
14
+ 'Ñ': '--.--', 'Ö': '---.', 'Ü': '..--'
15
+ }
16
+
17
+ # 反向映射表
18
+ REVERSE_MORSE_CODE_DICT = {value: key for key, value in MORSE_CODE_DICT.items()}
19
+
20
+ def morse(input_string: str) -> str:
21
+ """
22
+ 将字符串转换为摩尔斯电码。
23
+ :param input_string: 输入的字符串
24
+ :return: 转换后的摩尔斯电码(单词间用'/'分隔)
25
+ """
26
+ words = input_string.upper().split()
27
+ morse_words = []
28
+ for word in words:
29
+ morse_word = ' '.join(MORSE_CODE_DICT[char] for char in word if char in MORSE_CODE_DICT)
30
+ morse_words.append(morse_word)
31
+ return '/'.join(morse_words)
32
+
33
+ def unmorse(morse_code: str) -> str:
34
+ """
35
+ 将摩尔斯电码转换为字符串。
36
+ :param morse_code: 输入的摩尔斯电码(单词间用'/'分隔)
37
+ :return: 转换后的字符串
38
+ """
39
+ morse_words = morse_code.split('/')
40
+ plain_words = []
41
+ for morse_word in morse_words:
42
+ plain_word = ''.join(REVERSE_MORSE_CODE_DICT[code] for code in morse_word.split() if code in REVERSE_MORSE_CODE_DICT)
43
+ plain_words.append(plain_word)
44
+ return ' '.join(plain_words)
45
+
46
+ # 新增:摩尔斯电码帮助函数
47
+ def morse_help():
48
+ """
49
+ 打印摩尔斯电码的使用帮助信息。
50
+ """
51
+ print("以下是支持的字符及其对应的摩尔斯电码:")
52
+ for char, code in MORSE_CODE_DICT.items():
53
+ print(f"{char}: {code}")
54
+ print("以下是可以使用的函数:")
55
+ print("- morse(input_string): 将字符串转换为摩尔斯电码")
56
+ print("- unmorse(morse_code): 将摩尔斯电码转换为字符串")
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
mlymath-0.1.0/setup.py ADDED
@@ -0,0 +1,14 @@
1
+ from setuptools import setup, find_packages
2
+
3
+ setup(
4
+ name='mlymath',
5
+ version='0.1.0',
6
+ packages=find_packages(),
7
+ author='mly',
8
+ classifiers=[
9
+ 'Programming Language :: Python :: 3',
10
+ 'License :: OSI Approved :: MIT License',
11
+ 'Operating System :: OS Independent',
12
+ ],
13
+ python_requires='>=3.6',
14
+ )
@@ -0,0 +1,27 @@
1
+ from .sort import (
2
+ quick_sort,
3
+ shell_sort,
4
+ heap_sort,
5
+ bucket_sort,
6
+ insertion_sort,
7
+ bubble_sort,
8
+ merge_sort,
9
+ selection_sort,
10
+ counting_sort,
11
+ radix_sort,
12
+ sort_help
13
+ )
14
+
15
+ __all__ = [
16
+ 'quick_sort',
17
+ 'shell_sort',
18
+ 'heap_sort',
19
+ 'bucket_sort',
20
+ 'insertion_sort',
21
+ 'bubble_sort',
22
+ 'merge_sort',
23
+ 'selection_sort',
24
+ 'counting_sort',
25
+ 'radix_sort',
26
+ 'sort_help'
27
+ ]
@@ -0,0 +1,178 @@
1
+ def quick_sort(arr, reverse=False):
2
+ if len(arr) <= 1:
3
+ return arr
4
+
5
+ pivot = arr[len(arr) // 2]
6
+ left = [x for x in arr if x < pivot]
7
+ middle = [x for x in arr if x == pivot]
8
+ right = [x for x in arr if x > pivot]
9
+
10
+ # 递归调用时不传递 reverse 参数,仅在最终结果中应用 reverse
11
+ result = quick_sort(left) + middle + quick_sort(right)
12
+ return result[::-1] if reverse else result
13
+
14
+ def shell_sort(arr, reverse=False):
15
+ n = len(arr)
16
+ gap = n // 2 # 初始增量
17
+
18
+ while gap > 0:
19
+ for i in range(gap, n):
20
+ temp = arr[i]
21
+ j = i
22
+ # 对当前增量的子序列进行插入排序
23
+ while j >= gap and arr[j - gap] > temp:
24
+ arr[j] = arr[j - gap]
25
+ j -= gap
26
+ arr[j] = temp
27
+ gap //= 2 # 减小增量
28
+ return arr[::-1] if reverse else arr
29
+
30
+ def heap_sort(arr, reverse=False):
31
+ import heapq
32
+ arr = list(arr) # 复制输入列表,避免修改原始数据
33
+ if not arr:
34
+ return arr
35
+ heapq.heapify(arr)
36
+ result = [heapq.heappop(arr) for _ in range(len(arr))]
37
+ return result[::-1] if reverse else result
38
+
39
+ def bucket_sort(arr, reverse=False):
40
+ if not arr:
41
+ return arr
42
+
43
+ max_val = max(arr)
44
+ min_val = min(arr)
45
+ range_val = max_val - min_val
46
+
47
+ if range_val == 0:
48
+ return arr # 如果所有元素相同,直接返回
49
+
50
+ # 动态调整桶数量
51
+ bucket_count = max(10, int(len(arr) ** 0.5)) # 桶数量为 sqrt(n) 或至少 10
52
+ buckets = [[] for _ in range(bucket_count)]
53
+
54
+ for num in arr:
55
+ index = int((num - min_val) * (bucket_count - 1) / range_val)
56
+ buckets[index].append(num)
57
+
58
+ sorted_arr = []
59
+ for bucket in buckets:
60
+ sorted_arr.extend(sorted(bucket))
61
+
62
+ return sorted_arr[::-1] if reverse else sorted_arr
63
+
64
+ def insertion_sort(arr, reverse=False):
65
+ if not arr:
66
+ return arr
67
+ for i in range(1, len(arr)):
68
+ key = arr[i]
69
+ j = i - 1
70
+ while j >= 0 and key < arr[j]:
71
+ arr[j + 1] = arr[j]
72
+ j -= 1
73
+ arr[j + 1] = key
74
+ return arr[::-1] if reverse else arr
75
+
76
+ def bubble_sort(arr, reverse=False):
77
+ if not arr:
78
+ return arr
79
+ n = len(arr)
80
+ for i in range(n):
81
+ for j in range(0, n-i-1):
82
+ if arr[j] > arr[j+1]:
83
+ arr[j], arr[j+1] = arr[j+1], arr[j]
84
+ return arr[::-1] if reverse else arr
85
+
86
+ def merge_sort(arr, reverse=False):
87
+ if len(arr) <= 1:
88
+ return arr
89
+ mid = len(arr) // 2
90
+ left = merge_sort(arr[:mid])
91
+ right = merge_sort(arr[mid:])
92
+
93
+ merged = []
94
+ left_idx, right_idx = 0, 0
95
+ while left_idx < len(left) and right_idx < len(right):
96
+ if left[left_idx] < right[right_idx]:
97
+ merged.append(left[left_idx])
98
+ left_idx += 1
99
+ else:
100
+ merged.append(right[right_idx])
101
+ right_idx += 1
102
+ merged.extend(left[left_idx:])
103
+ merged.extend(right[right_idx:])
104
+ return merged[::-1] if reverse else merged
105
+
106
+ def selection_sort(arr, reverse=False):
107
+ if not arr:
108
+ return arr
109
+ for i in range(len(arr)):
110
+ min_idx = i
111
+ for j in range(i+1, len(arr)):
112
+ if arr[j] < arr[min_idx]:
113
+ min_idx = j
114
+ arr[i], arr[min_idx] = arr[min_idx], arr[i]
115
+ return arr[::-1] if reverse else arr
116
+
117
+ def counting_sort(arr, reverse=False):
118
+ if not arr:
119
+ return arr
120
+ max_val = max(arr)
121
+ min_val = min(arr)
122
+ offset = -min_val # 添加偏移量以支持负数
123
+ count = [0] * (max_val - min_val + 1)
124
+ for num in arr:
125
+ count[num + offset] += 1
126
+ sorted_arr = []
127
+ for i in range(len(count)):
128
+ sorted_arr.extend([i - offset] * count[i]) # 还原原始值
129
+ return sorted_arr[::-1] if reverse else sorted_arr
130
+
131
+ def radix_sort(arr, reverse=False):
132
+ if not arr:
133
+ return arr
134
+
135
+ # 分离负数和非负数
136
+ negatives = [-x for x in arr if x < 0]
137
+ non_negatives = [x for x in arr if x >= 0]
138
+
139
+ def radix_sort_non_negative(nums):
140
+ max_val = max(nums) if nums else 0
141
+ exp = 1
142
+ while max_val // exp > 0:
143
+ count = [0] * 10
144
+ output = [0] * len(nums)
145
+ for num in nums:
146
+ index = (num // exp) % 10
147
+ count[index] += 1
148
+ for i in range(1, 10):
149
+ count[i] += count[i-1]
150
+ i = len(nums) - 1
151
+ while i >= 0:
152
+ index = (nums[i] // exp) % 10
153
+ output[count[index]-1] = nums[i]
154
+ count[index] -= 1
155
+ i -= 1
156
+ nums = output.copy()
157
+ exp *= 10
158
+ return nums
159
+
160
+ # 对负数和非负数分别排序
161
+ negatives_sorted = [-x for x in radix_sort_non_negative(negatives)[::-1]]
162
+ non_negatives_sorted = radix_sort_non_negative(non_negatives)
163
+
164
+ result = negatives_sorted + non_negatives_sorted
165
+ return result[::-1] if reverse else result
166
+
167
+ def sort_help():
168
+ print("可用的排序算法:")
169
+ print("- quick_sort: 使用快速排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")
170
+ print("- shell_sort: 使用希尔排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")
171
+ print("- heap_sort: 使用堆排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")
172
+ print("- bucket_sort: 使用桶排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")
173
+ print("- insertion_sort: 使用插入排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")
174
+ print("- bubble_sort: 使用冒泡排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")
175
+ print("- merge_sort: 使用归并排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")
176
+ print("- selection_sort: 使用选择排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")
177
+ print("- counting_sort: 使用计数排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")
178
+ print("- radix_sort: 使用基数排序算法对数组进行排序。可通过 reverse 参数控制排序顺序(默认正序)")