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";
    }

これを 2 回実行すると、同じ並べ替えられていないランダムに生成された配列が使用されます。

            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;

上記のコードは、すべて同じ配列を参照する 4 つの変数を作成します。したがって、最初の並べ替えアルゴリズムは配列を並べ替え、後続の並べ替えアルゴリズムは既に並べ替えられている配列に遭遇するため、非常に高速に実行されます。

簡単な解決策は、Linq - ToList を使用して配列を複製することです。

        randomArray = randomizedArray
            (Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text));
        randomArrayGnome = randomArray.ToList();
于 2013-03-28T06:34:21.100 に答える
2

randomArray& randomArrayGnomeboth は への参照を保持しますrandomizedArray

電話すると

GnomeSort(randomArray);
BubbleSort(randomArrayBubble);

参照配列は既にソートさBubbleSortれています。すでにソートされている配列で作業しています!

Array.Clone()4つの異なるリファレンスを作成するように使用できます!

于 2013-03-28T06:35:25.520 に答える