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,即使它在调试时具有正确的值。并且它也没有为 shell 排序和快速排序提供正确的值。

另一个尴尬的部分是,当我注释掉气泡和选择排序时,插入会给出正确的结果,这对所有算法都是如此,如果我按顺序将它们设为第一个,我会得到正确的结果,我把这个展示给我的朋友,他们也没有任何线索,这真的没有任何意义......

4

4 回答 4

4

这是不可能的

是什么让你断定这是不可能的?请记住,即使Stopwatch精度有限。0并不意味着“根本不需要时间”;它可能意味着“没有足够的时间以可用的精度进行注册”。为了在快速的事情上获得合理的计时,您通常需要在计时区域内的循环中执行多次(意味着:数千甚至数百万次)。没有看到什么Insertion,据我们所知,这很好。

就个人而言,我会使用:

sw = Stopwatch.StartNew();
// probably loop here!!
i5k.Insertion(array);
sw.Stop();
于 2013-03-04T14:04:24.407 回答
4

如果数组已经排序,则您的插入排序可能无事可做,并且在不到 1 毫秒的时间内完成。如果您之前的排序使数组排序,这可能是可能的。

编辑- 我显然很难输入“可能”而不是“可能”这个词......更正。)

于 2013-03-04T14:21:12.023 回答
2
 elapsedTime = sw.ElapsedMilliseconds;

一毫秒是很长的时间,现代处理器可以在一毫秒内执行数百万条指令。足以让您在不到一毫秒的时间内完成插入排序,因此 ElapsedMilliseconds 返回 0。避免丢弃您从 Stopwatch 获得的分辨率,请改用其 Elapsed 属性。

于 2013-03-04T14:09:37.073 回答
1

不要使用 Stopwatch.ElapsedMilliseconds,如果操作时间少于 1 毫秒,它将返回 0。

请改用 Stopwatch.ElapsedTicks。并按照马克上面所说的去做。

于 2013-03-04T14:12:07.277 回答