2010-12-18 54 views
0

歸併排序算法的代碼應該像合併排序算法,但它不工作,並給出了輸出0,而不是數字進行排序,什麼問題的朋友?謝謝問題在C#

private void button3_Click(object sender, EventArgs e) 
    { 


     string[] source = textBox1.Text.Split(','); 
     string[] source1 = textBox3.Text.Split(','); 
     int[] nums2 = new int[8]; 
     int[] nums = new int[source.Length]; 
     for (int i = 0; i < source.Length; i++) 
     { 
      nums[i] = Convert.ToInt32(source[i]); 

     } 
     int[] nums1 = new int[source1.Length]; 
     for (int j = 0; j < source1.Length; j++) 
     { 
      nums1[j] = Convert.ToInt32(source1[j]); 
     } 
     int x = 0; 
     int y = 0; 
     int z = 0; 

     while (x < nums.Length && y < nums1.Length) 
     { 
      if (nums[x] < nums1[y]) 
      { 
       nums2[z] = nums[x]; 
       x++; 

      } 
      else 
      { 
       nums2[z] = nums1[y]; 
       y++; 
      } 

      z++; 
     } 

     while (x > nums.Length){ 
      if (y <= nums1.Length) 
      { 
       nums2[z] = nums1[y]; 

       z++; 
       y++; 
      } 
     } 
     while (y > nums1.Length) 
     { 

      if (x <= nums.Length) 
      { 
       nums2[z] = nums[x]; 
       z++; 
       x++; 
      } 
     } 
      string merge = ""; 
      foreach (var n in nums2) 
       merge += n.ToString() + ","; 
      textBox4.Text = merge; 


     } 
+3

更容易實現一個問題是你沒有適當地命名你的按鈕。 – dreamlax 2010-12-18 08:13:12

+6

這是熟悉IDE提供的調試器的絕佳機會。單步執行代碼並觀察變量的值。當他們的價值觀不符合您的期望時,請抓緊時間,並對您的代碼進行適當的修改。 – 2010-12-18 08:16:40

+0

謝謝,但它的名稱是正確的 – Arash 2010-12-18 08:16:44

回答

1

爲了徹底讓你的輸出,嘗試

string merge=""; 
    foreach(var n in nums2) 
     merge+=n.ToString() + " "; 
    textBox4.Text = merge; 

(好吧,這是可以做到更快/更好/發燒友使用LINQ &的string.join,或StringBuilder的,但是出於測試目的,這應該是足夠了)。

也許這並不能解決上述代碼中的所有問題,但它可能會幫助您更輕鬆地進行調試。

+0

分開,現在應該發送到textbox4? – Arash 2010-12-18 09:07:35

1

if (y > nums1.Length-1) 

,因爲你要測試的每個這些條件不應該是內部

if (x > nums1.Length-1) 

。如果您退出第一個while循環,因爲x >= nums.Length - 1,您希望確保您一直運行y

1
  1. 邏輯是一團糟。你不應該使用 'nums2'來存儲結果,我建議你 應該使用更好的名字。
  2. 你指定num2 = new int [5]?你 應該使用別的東西,如果你不知道 確切的長度。改用列表 代替。性能較慢,但其 更適合小排列 排序。
  3. int z = 0;不是 執行的正確方法。如果你有while循環和 需要增加計數,爲什麼你不用 循環?
  4. 在「如果」後「而」你保持 沒有它重置爲 遞增Z「0」,它會索引超出範圍

的邏輯是通過LINQ

var numA = new int[]{...}; 
var numB = new int[]{...}; 

var result = numA.Union(numB).OrderBy(num => num); // add .Distinct() if you like