秒表显示错误的时间?

时间:2013-03-28 06:30:40

标签: c#

    public void GnomeSort<T>(IList<T> list, IComparer<T> comparer)
    {
        sortTimer = new Stopwatch();
        sortTimer.Start();
        bool stillGoing = true;
        while (stillGoing)
        {
            stillGoing = false;
            for (int i = 1; i < list.Count; )
            {
                T x = list[i - 1];
                T y = list[i];
                if (comparer.Compare(x, y) <= 0)
                    i++;
                else
                {
                    list[i - 1] = y;
                    list[i] = x;
                    i--;
                    if (i == 0)
                        i = 1;
                    stillGoing = true;
                }
            }
        }
        sortTimer.Stop();
        richTextBox1.Text += "Gnome Sorting completed, total time taken " + sortTimer.Elapsed + "\n";
    }

如果我运行两次,在这里使用相同的未分类随机生成的数组:

            randomArray = randomizedArray
                (Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text));
            randomArrayGnome = randomArray;
            randomArrayBubble = randomArray;
            randomArrayInsertion = randomArray;

            GnomeSort(randomArray);
            BubbleSort(randomArrayBubble);

但它输出了接近这个的东西:

Gnome Sorting completed, total time taken 00:00:02.5419864
Bubble Sorting completed, total time taken 00:00:00.0003556

但如果我切换了通话顺序,则时间会有很大的不同,相反,冒泡排序可能需要6秒。这里发生了什么?怎么没有正确排序呢?

2 个答案:

答案 0 :(得分:3)

您的问题在于您对阵列的初始化。如下所示:

        randomArray = randomizedArray
            (Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text));
        randomArrayGnome = randomArray;
        randomArrayBubble = randomArray;
        randomArrayInsertion = randomArray;

上面的代码创建了四个引用相同数组的变量。所以会发生的事情是第一种排序算法对数组进行排序,后续的数组会遇到一个已经排序的数组,因此执行速度非常快。

简单的解决方案是使用Linq - ToList来克隆数组:

        randomArray = randomizedArray
            (Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text));
        randomArrayGnome = randomArray.ToList();

答案 1 :(得分:2)

randomArray&amp; randomArrayGnome都保留对randomizedArray的引用。

致电时

GnomeSort(randomArray);
BubbleSort(randomArrayBubble);

引用数组已经排序,BubbleSort正在处理已排序的数组!

您可以使用Array.Clone()创建四个不同的引用!