【发布时间】:2014-03-29 18:50:36
【问题描述】:
我已经在 Python 和 Java 中实现了 stooge sort,但是随着输入大小的增加,与 Java 实现相比,Python 中的运行时间似乎呈指数增长。我知道算法在 Java 中比在 Python 中运行得更快的情况并不少见,但肯定不会慢这么多。
这是 Java 代码:
import java.util.Arrays;
public class Stooge {
public static void main(String[] args) {
int[] nums = new int[10000];
for (int i = 10000; i > 0; i--) {
nums[10000-i] = i;
}
stoogeSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void stoogeSort(int[] L) {
stoogeSort(L, 0, L.length);
}
public static void stoogeSort(int[] L, int i, int j) {
if (L[j-1] < L[i]) {
int tmp = L[i];
L[i] = L[j-1];
L[j-1] = tmp;
}
if (j - i >= 3) {
int t = (j - i) / 3;
stoogeSort(L, i, j-t);
stoogeSort(L, i+t, j);
stoogeSort(L, i, j-t);
}
}
}
和等效的 Python 版本:
def main():
nums = [i for i in range(10000, 0, -1)]
stoogeSort(nums)
print(nums)
def stoogeSort(L):
stoogeSortRec(L, 0, len(L))
def stoogeSortRec(L, i, j):
if L[j-1] < L[i]:
tmp = L[i]
L[i] = L[j-1]
L[j-1] = tmp
if j-i >= 3:
t = (j-i) // 3
stoogeSortRec(L, i, j-t)
stoogeSortRec(L, i+t, j)
stoogeSortRec(L, i, j-t)
【问题讨论】:
-
在 Python 中交换变量时不需要临时变量:
L[i], L[j-1] = L[j-1], L[i] -
我真的很困惑为什么你要两次调用同一个函数。 (你在第一个和最后一个调用相同的 stoogeSortRec 。)另外,与问题无关,但你不需要在 python 中使用 tmp 进行交换。
L[i], L[j-1] = L[j-1], L[i] -
@Imagine:重复排序是Stooge Sort算法的一部分,以三个臭皮匠的名字命名。请注意,此算法甚至比冒泡排序还要慢。
-
@Daniel Roseman,我这样做只是为了更容易比较两者。不过感谢您的建议!
-
你所说的“指数”是什么意思?您是否尝试过输入并且时间的比率随着
2^n而增长,或者您只是随机使用该术语?然而,这是一个经典的例子,JIT 产生了巨大的不同,因为它可以在对整数数组进行操作时优化大量的东西......尝试在 PyPy 中运行 python 代码。
标签: java python sorting python-3.x recursion