python - Python - 快速排序递归 - 如何解决堆栈溢出?
问题描述
我正在做一个作业,需要编写一个快速排序函数来根据某个键对(nx 3)矩阵进行排序。
例如,用户输入键 [2,0,1]。这意味着程序必须首先对第三列进行排序,如果有任何相等的值,它会检查第一列来决定排序。如果值仍然相等,则转到第二列。
例子:
key = [2,0,1]
matrix = [["0","1", "1"], ["0","1", "1"], ["1","1", "2"], ["2","0", "1"], ["2","2", "0"]]
预期结果:
[['2', '2', '0'], ['0', '1', '1'], ['0', '1', '1'], ['2', '0', '1'], ['1', '1', '2']]
我使用递归编写了以下代码。它适用于小于 1000 的矩阵。如果我有一个更大的矩阵,由于 Python 约束,它会给我一个堆栈溢出错误。
我抬头发现我可以使用记忆技术来克服这个问题。有谁知道如何在我的代码上实现这样的事情?
def QuickSort (matrix, key, start = 0, end = None):
if end is None:
end = len(matrix)-1
if start < end:
p = partition(matrix, start, end, key)
QuickSort(matrix, key, start, p - 1)
QuickSort(matrix, key, p + 1, end)
return matrix
def partition (matrix, start, end, ordekeym):
pivot = matrix[end]
i = start
for j in range (start, end):
if matrix[j][key[0]] < pivot[key[0]]:
matrix[j], matrix[i] = matrix[i], matrix[j]
i = i + 1
if matrix[j][key[0]] == pivot[key[0]] and len(key) == 2:
if matrix[j][key[1]] < pivot[key[1]]:
i = i+1
if matrix[j][key[0]] == pivot[key[0]] and len(key) == 3:
if matrix[j][key[1]] < pivot[key[1]]:
i = i + 1
if matrix[j][key[1]] == pivot[key[1]]:
if matrix[j][key[2]] < pivot[key[2]]:
i = i + 1
if matrix[j][key[2]] == pivot[key[2]]:
break
matrix[i], matrix[end], = matrix[end], matrix[i]
return i
print(QuickSort(matrix, key))
解决方案
推荐阅读
- java - 尝试在某些输入的数字上开始新的活动
- python - .loc 数据框导致值错误无法将非有限值(NA 或 inf)转换为整数
- c# - 添加动画后播放器不翻转
- android - 迁移到 BOM 后如何使用 maven-publish gradle 插件生成 maven pom
- c - C 编程 - 使用 sscanff 解析字符串的文件 io
- sql - 此 SQL 更新语句是否删除了记录?
- java - 使用 BeforeEnterObserver 重定向到外部 URL
- python - 调整绘图
- go - 如何从源代码编译 InfluxDB
- reactjs - 如何使用 .env 保护您的数据?