0

好的,所以我已经编写了一些基本代码来测试各种排序方法(目前只测试一种排序方法)并找到最有效的方法。为了使结果被认为是准确的,我计划在不同大小的阵列上多次运行测试。我没有一遍又一遍地手动运行相同的测试,而是尝试创建一个递归函数,但到目前为止我所拥有的并不起作用(基本情况并不完全起作用,它会永远持续下去)。有人可以帮助我,以便我可以使用有效的递归方法多次运行测试吗?

旁注,我已经写了大约 5 种不同的排序方法(如下所示的 selectionSort),并且想知道是否有人对在测试方法中旋转它们的最佳方法有任何想法,这样我就不必将 selectionSort 更改为否则每次我想测试不同的排序方法。干杯。

public void testSorts(){

    int size = 100;
    if(size < 1000000){
        String[] data;
        long start;
        long time;

        UI.println("\n\n======Selection Sort=======\n");

        data = createArray(size);
        start = System.currentTimeMillis();
        selectionSort(data);
        time =  System.currentTimeMillis() - start;

        UI.printf("Number of items:  %,d\n", data.length);
        UI.printf("Sorted correcetly: %b\n", testSorted(data));
        UI.printf("Time taken:       %.2f s\n", time/1000.0);

        UI.println("\n=======DONE=========\n");

        size = size*10;
        testSorts();

    }
4

4 回答 4

0

我同意其他回答者的观点,即这里不需要使用递归,@Rein 或多或少地建议了我会做什么。

关于“自动”尝试不同类型的排序,您可以:

  • 定义一个包含public String[] sort(String[] data)方法的接口
  • 使用实现排序接口的各种实现在您的测试类中填充一个列表。
  • 在测试类的现有循环内部或外部有另一个循环迭代您委托搜索的对象(取决于您是否希望所有算法都具有一种大小或一个算法顺序的所有大小)

这意味着您的搜索算法与您的“测试工具”类很好地分开。

于 2013-01-25T17:20:06.267 回答
0

如果您将“size”参数传递给您的 testSorts 函数,您可以解决此问题。就目前而言,您只是在自身内部调用相同的函数而没有任何更改,因此您将获得一个无限循环(实际上是堆栈溢出)。

作为一个更大的评论,我认为没有任何理由为此使用递归。

于 2012-09-10T14:10:37.993 回答
0

你为什么不创建一个方法'test()',其中包含一个调用你实际测试方法的for循环?你的 for 循环可以增加 100,就像你的 'testSorts' 方法一样。

for(int size = 0; size < 1000000; size += 100) {
  testSort(size);
}
于 2012-09-10T14:10:39.910 回答
0

问题是您的变量size是该方法的本地变量,因此当您增加大小然后testSorts再次调用时,会在递归调用的范围内创建一个“新大小”变量。

要递归使用它,您必须:

public void testSorts(int size){

    if(size < 1000000){
        ....
        size = size*10;
        testSorts(size);
    }
}

但是,我会使用一个简单的循环将每个步骤的大小增加一个数量级:

for (int size = 100; size < 1000000; size = size * 10){
    String[] data;
    long start;
    long time;

    UI.println("\n\n======Selection Sort=======\n");

    data = createArray(size);
    start = System.currentTimeMillis();
    selectionSort(data);
    time =  System.currentTimeMillis() - start;

    UI.printf("Number of items:  %,d\n", data.length);
    UI.printf("Sorted correcetly: %b\n", testSorted(data));
    UI.printf("Time taken:       %.2f s\n", time/1000.0);

    UI.println("\n=======DONE=========\n");
}
于 2012-09-10T14:14:53.393 回答