0
    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 秒。这里发生了什么?为什么它没有正确排序它们?

4

2 回答 2

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();
于 2013-03-28T06:34:21.100 回答
2

randomArray&randomArrayGnome都持有对randomizedArray.

你打电话时

GnomeSort(randomArray);
BubbleSort(randomArrayBubble);

参考数组已经排序,BubbleSort正在处理一个已经排序的数组!

您可以使用Array.Clone(),以便创建四个不同的参考!

于 2013-03-28T06:35:25.520 回答