2013-03-28 171 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(),以創建四個不同的參考!