-1

これは非常に単純で単純な問題ですが、もちろん、私はなんとか間違ったことをすることができました。最初に、1から10、1から100、最大1から100,000までの10個の乱数の5つの異なる配列を生成しました。次に、各配列を取得して、5つの異なるタイプのソート(合計25)を実行し、ソートの実行にかかる時間を計算しました。nのサイズに関係なく、すべての結果が0msである理由がわかりません。私は何が間違っているのですか?

public class Lab16Sorting {

public static void main(String[] args) 
{
    final int TOTAL_NUMBERS = 10;
    int count;
    int[] num = new int[TOTAL_NUMBERS];
    Random rand = new Random();

    // Generate 10 numbers from 1 - 10  
    System.out.println("SORT 10");
    System.out.println("----------------");

    for (count = 0; count < TOTAL_NUMBERS; count++)
        num[count] = rand.nextInt(10);

    System.out.println("Array: " + num);
    runSort(num);

    // Generate 10 numbers from 1 - 100     
    System.out.println("\nSORT 100");
    System.out.println("----------------");

    for (count = 0; count < TOTAL_NUMBERS; count++)
        num[count] = rand.nextInt(100);

    System.out.println("Array: " + num);
    runSort(num);

    // Generate 10 numbers from 1 - 1,000       
    System.out.println("\nSORT 1,000");
    System.out.println("----------------");

    for (count = 0; count < TOTAL_NUMBERS; count++)
        num[count] = rand.nextInt(1000);

    System.out.println("Array: " + num);
    runSort(num);

    // Generate 10 numbers from 1 - 10,000  
    System.out.println("\nSORT 10,000");
    System.out.println("----------------");

    for (count = 0; count < TOTAL_NUMBERS; count++)
        num[count] = rand.nextInt(10000);

    System.out.println("Array: " + num);
    runSort(num);

    // Generate 10 numbers from 1 - 100,000     
    System.out.println("\nSORT 100,000");
    System.out.println("----------------");

    for (count = 0; count < TOTAL_NUMBERS; count++)
        num[count] = rand.nextInt(100000);

    System.out.println("Array: " + num);
    runSort(num);
}

/**
 * Run sort algorithms
 */

private static void runSort(int[] num)
{
    long before;
    long after;

    // Run and display selection sort
    before = System.currentTimeMillis();
    selectionSort(num);     
    after = System.currentTimeMillis();
    System.out.println("Selection sort took "+ (after-before) +" milliseconds");

    // Run and display bubble sort
    before = System.currentTimeMillis();
    bubbleSort(num);
    after = System.currentTimeMillis();
    System.out.println("Bubble sort took "+ (after-before) +" milliseconds");

    // Run and display insertion sort
    before = System.currentTimeMillis();
    insertionSort(num);     
    after = System.currentTimeMillis();
    System.out.println("Insertion sort took "+ (after-before) +" milliseconds");

    // Run and display merge sort
    before = System.currentTimeMillis();
    mergeSort(num);
    after = System.currentTimeMillis();
    System.out.println("Merge sort took "+ (after-before) +" milliseconds");

    // Run and display quick sort
    before = System.currentTimeMillis();
    quickSort(num);
    after = System.currentTimeMillis();
    System.out.println("Quick sort took "+ (after-before) +" milliseconds");        
}

さまざまな配列アドレスを印刷しましたが、それらはすべて同じであることがわかります(同じ配列オブジェクトを使用しているため、これは理にかなっています)。それが問題だと思ったので、別の配列(int[] num、 ...)を使用してみました。また、。を使用してメソッドを呼び出すint[] num2たびに、配列を再初期化してみました。runSort()num = new int[TOTAL_NUMBERS]

4

3 に答える 3

2

これは、サイズ10が小さすぎて、さまざまな種類の種類のタイミングの違いを実際に見つけることができないためです。実際に違いを確認できるように、サイズを約まで大きくしてみてください50,0001,00,000それでも数秒でわかります)。

また、マシンに十分な負荷がかかる場合は、次の範囲で要素を並べ替えてください10,00,000(時差をテストするためだけに使用することはお勧めできません)。

于 2013-03-14T03:13:52.773 に答える
0

RJは正しいです。配列が小さすぎるため、並べ替えアルゴリズムは重要ではありません。

挿入ソート、マージソート、クイックソートについては、このスレッドのテストケースも参照してください。

于 2013-03-14T03:22:16.960 に答える
0

ソートアルゴリズムは、JonL.BentleyとM.DouglasMcIlroyの「EngineeringaSortFunction」、Software-Practice and Experience、Vol。23(11)P. 1249-1265(1993年11月)。このアルゴリズムは、多くのデータセットでn * log(n)のパフォーマンスを提供し、他のクイックソートのパフォーマンスを2次パフォーマンスに低下させます。上記はjavadocにあります。

于 2013-03-14T03:29:54.627 に答える