2013-03-28 172 views
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秒。这里发生了什么?为什么不能正确分类?

回答

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(); 
2

randomArray & randomArrayGnome既保持所述参照randomizedArray

当你调用

GnomeSort(randomArray); 
BubbleSort(randomArrayBubble); 

参考阵列已经排序,BubbleSort正在一个已经排序阵列上!

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