0

さて、私はさまざまなソート方法をテストし(現時点では1つのソート方法のみをテストする)、最も効率的なものを見つけることになっているいくつかの基本的なコードを書きました。結果が正確であると見なされるように、さまざまなサイズのアレイでテストを数回実行することを計画しています。同じテストを手動で何度も実行するのではなく、再帰関数を作成しようとしましたが、これまでのところ機能しません(基本ケースは完全に機能せず、永遠に続きます)。誰かが私を助けてくれませんか?それで私は実用的な再帰的方法を使ってテストを数回実行することができますか?

ちなみに、私は約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

問題は、変数sizeがメソッドに対してローカルであるため、サイズを増やしてからtestSorts再度呼び出すと、再帰呼び出しのスコープ内に「新しいサイズ」変数が作成されることです。

これを再帰的に使用するには、次のようにする必要があります。

public void testSorts(int size){

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

ただし、単純なループを使用して、各ステップでサイズを 1 桁ずつ増やします。

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 に答える
0

ここで再帰を使用する必要がないという他の回答者に同意します.@Reinは、多かれ少なかれ私が何をするかを示唆しています。

さまざまな種類の並べ替えを「自動的に」試すことに関しては、次のことができます。

  • public String[] sort(String[] data)メソッドを含むインターフェースを定義する
  • ソート インターフェイスを実装するさまざまな実装を使用して、テスト クラスの List を設定します。
  • テストクラスの既存のループの内側または外側に別のループを作成して、検索をデリゲートするオブジェクトを繰り返します (すべてのアルゴリズムを 1 つのサイズにするか、1 つのアルゴリズムの順序ですべてのサイズにするかによって異なります)。

これは、検索アルゴリズムが「テスト ハーネス」クラスから適切に分離されていることを意味します。

于 2013-01-25T17:20:06.267 に答える
0

「サイズ」パラメーターを testSorts 関数に渡した場合、これを修正できます。現状では、同じ関数を変更せずに呼び出しているだけなので、無限ループ (実際にはスタック オーバーフロー) が発生します。

全体像のコメントとして、これに再帰を使用する理由はありません。

于 2012-09-10T14:10:37.993 に答える
0

実際のテスト メソッドを呼び出す for ループを含むメソッド 'test()' を作成してみませんか? 「testSorts」メソッドのように、for ループが 100 ずつインクリメントされる可能性があります。

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