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秒。这里发生了什么?怎么没有正确排序呢?
答案 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()
创建四个不同的引用!