3

だから、私はすべての検索アルゴリズムを持っており、各アルゴリズムに20000の乱数を送信して、それぞれにかかる時間を把握しようとしています。

        public void functionsForSorts(int[] array)
    {
        Stopwatch sw = new Stopwatch();
        long elapsedTime = sw.ElapsedTicks;

        if (array.Length == 20000) 
        {
            sw.Start();
            BubbleSort.Bubble(array);
            sw.Stop();
            elapsedTime = sw.ElapsedMilliseconds;
            label1.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
            Application.DoEvents();

            sw.Restart();
            SelectionSort.Selection(array);
            sw.Stop();
            elapsedTime = sw.ElapsedMilliseconds;
            label2.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
            Application.DoEvents();

            sw.Restart();
            InsertionSort.Insertion(array);
            sw.Stop();
            elapsedTime = sw.ElapsedMilliseconds;
            label3.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
            Application.DoEvents();

            sw.Restart();
            MergeSort.mergeSort(array, 0, array.Length - 1);
            sw.Stop();
            elapsedTime = sw.ElapsedMilliseconds;
            label4.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
            Application.DoEvents();

            sw.Restart();
            ShellSort.Shell(array);
            sw.Stop();
            elapsedTime = sw.ElapsedMilliseconds;
            label5.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
            Application.DoEvents();

            sw.Restart();
            QuickSort.Quicksort(array, 0, array.Length - 1);
            sw.Stop();
            elapsedTime = sw.ElapsedMilliseconds;
            label6.Text += "\t" + elapsedTime.ToString() + " miliseconds ";
            Application.DoEvents();
        }

問題は、ストップウォッチが適切な結果をもたらさないことです。バブルソート、選択ソート、マージソートでは問題なく動作しますが、デバッグ中に適切な値を持っていても、挿入ソートには常に0を書き込みます.andシェルソートとクイックソートにも適切な値が与えられません。

これに関するもう1つの厄介な部分は、バブルと選択ソートをコメントアウトすると、挿入により適切な結果が得られることです。これはすべてのアルゴリズムに当てはまります。それらを順番に1番目にすると、適切な結果が得られます。これを友達に見せました、彼らも何の手がかりも持っていません、これは本当にまったく意味がありません...

4

4 に答える 4

4

配列が既にソートされている場合、挿入ソートが何も行わず、1 ミリ秒未満で終了した可能性があります。以前の並べ替えで配列が並べ替えられたままになっている場合、これが可能になる可能性があります。

(編集- 「可能性」ではなく「可能性」という単語を入力するのに本当に苦労しているようです...修正されました。)

于 2013-03-04T14:21:12.023 に答える
4

これは不可能です

それが不可能であるとあなたが結論づけるのは何ですか?Stopwatch精度が限られていることに注意してください。0「まったく時間がかからなかった」という意味ではありません。「利用可能な精度で登録するのに十分な時間がかからなかった」ことを意味する場合があります。高速なもので適切なタイミングを取得するには、多くの場合、タイミング領域内のループで複数回 (つまり、数千回または数百万回) 実行する必要があります。何をするかを見なくてInsertionも、これで問題ないことはわかっています。

個人的には、次を使用します。

sw = Stopwatch.StartNew();
// probably loop here!!
i5k.Insertion(array);
sw.Stop();
于 2013-03-04T14:04:24.407 に答える
2
 elapsedTime = sw.ElapsedMilliseconds;

ミリ秒は非常に長い時間であり、最新のプロセッサは1ミリ秒で数百万の命令を実行できます。挿入ソートを1ミリ秒未満で完了するのに十分なので、ElapsedMillisecondsは0を返します。Stopwatchから取得した解像度を破棄するのではなく、代わりにElapsedプロパティを使用してください。

于 2013-03-04T14:09:37.073 に答える
1

操作にかかった時間が 1 ミリ秒未満の場合に 0 を返す Stopwatch.ElapsedMilliseconds は使用しないでください。

代わりに Stopwatch.ElapsedTicks を使用してください。また、マークが上で言ったことも実行してください。

于 2013-03-04T14:12:07.277 に答える