2

我正在尝试编写一个相当快速的快速排序,但这在许多其他应用程序中都有使用。

内置的 filter(function, iterable) 函数返回可迭代项的列表,当传递给函数时返回 true,并且当您只需要检查一个列表的一个条件时,它比传统的 for 循环快得多。

我正在寻找的是一个非常快的函数(如过滤器),它不仅会构造一个新列表,还会从旧列表中删除它所获取的项目。在单轴快速排序的应用中,这将允许删除过滤器语句,并且分区例程的速度可能接近 2 倍。

python有内置这样的功能吗?numpy 呢?如果没有,最快的实现方法是什么?

作为参考,这里是当前的分区代码:

def partition(u):
    lesser = singleQuicksort(filter(lambda num: num <= u[0], u[1:]))
    greater = singleQuicksort(filter(lambda num: num > u[0], u[1:]))
    return lesser, greater
4

2 回答 2

1

使用布尔掩码:

def partition(u):
    mask = u[1:] <= u[0]
    return u[1:][mask], u[1:][~mask]
于 2013-09-04T12:59:00.913 回答
0

numpy,某种。那是数组索引。当您想“过滤”出以下情况时,请考虑以下情况inf

a=array([1,2,3,4,inf])
a[isfinite(a)]

或小于 3 的值

a=array([1,2,3,4,5])
a[a>3]

为什么是“某种”?因为索引仍然会创建一个新数组:

>>> a=array([1,2,3,4,inf])
>>> a[isfinite(a)]
array([ 1.,  2.,  3.,  4.])
>>> id(a)
40165288 #your result will differ
>>> id(a[1])
40253288
>>> id(a[isfinite(a)][1])
39747512
>>> a[1]
2.0
>>> a[isfinite(a)][1]
2.0
于 2013-09-04T04:01:57.523 回答