python - 这个算法是否占用了太多的额外空间,成为 "in place"?

标签 python python-3.x algorithm sorting

作业是对向量中的负数和正数进行排序。问题是该算法必须是 O(n) 并且到位。
我的“解决方案”是:

def Rearrange(arr):
    neg = []
    pos = []
    for x in arr:
        if x < 0:
            neg.append(x)
        else:
            pos.append(x)
    return neg + pos

所以,我想知道这个算法是否到位?我知道循环和追加操作满足就地算法。但是存储值的列表又如何呢?它是否使用了太多额外空间来满足就地算法?如果确实如此,是否有一个简单的方法可以解决这个明显的问题?现在我有点陷入困境。

最佳答案

是否需要对整个数组进行排序,或者只是左侧为负值,右侧为正值(和 0)?

如果你想要实现的是第二件事,那么下面的函数应该可以工作(它可以就地工作,并且时间复杂度为 O(n)):

def rearrange(array):

    left = 0
    right = len(array) - 1

    while left < right:
        if array[left] >= 0 > array[right]:
            array[right], array[left] = array[left], array[right]
            left += 1
            right -= 1
        elif array[left] < 0:
            left += 1
        else:
            right -= 1

>>> array = [-5, 6, 7, -4, 2, 0, -1]
>>> rearrange(array)
>>> array 
[-5, -1, -4, 7, 2, 0, 6]

关于python - 这个算法是否占用了太多的额外空间,成为 "in place"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49877595/

相关文章:

python - 如何在OpenAI的Answer api中使用文件

python - Plotly:如何使用 plotly express 为多个轨迹设置标记符号形状?

python - 如何在 Spark DataFrame 中添加常量列?

python-3.x - Python,不能在里面使用几何管理器包

algorithm - 对 HTTP post 对象进行分类的最便宜的方法

python lambda 使用多个参数引发变量未定义错误

python - 检查一个 Python 脚本是否使用另一个 Python 脚本进行编译

python - 如何从 Python 扩展模块的 C 代码调用内置函数(或方法)?

algorithm - 许可证 key 模式检测?

java - 如何将C++中的反向函数代码转换成Java