C#中的mergesort算法问题

时间:2010-12-18 08:11:09

标签: c# algorithm mergesort

这段代码应该像合并排序算法一样工作,但它不起作用并给出输出0而不是排序数字,问题是什么朋友?谢谢

 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 个答案:

答案 0 :(得分:1)

要完全获得输出,请尝试

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

(好吧,使用Linq&amp; String.Join或StringBuilder可以更快/更好/更好地完成,但出于测试目的,这应该足够了。)

也许这并不能解决上面代码的所有问题,但它可能会帮助您更轻松地调试它。

答案 1 :(得分:1)

该行

if (y > nums1.Length-1)

不应该在里面

if (x > nums1.Length-1)

因为你想测试每个条件。如果您因while而退出第一个x >= nums.Length - 1循环,则您希望确保自己也运行y直到结束。

答案 2 :(得分:1)

  1. 逻辑是一团糟。你不应该使用 'nums2'来存储结果,我建议你 应该用一个更好的名字。
  2. 你指定num2 = new int [5]?您 如果你不这样做,应该使用别的东西 知道确切的长度。例如使用List 代替。表现较差但其表现较差 更适合小阵列 排序
  3. int z = 0;不是一个正确的方法 实行。如果你有while循环和 需要增量计数,你为什么不 用于循环?
  4. 在'if'之后'while'你保持 递增z而不将其重置为  '0'它将指数超出范围
  5. 通过LINQ

    可以更容易地实现逻辑
    var numA = new int[]{...};
    var numB = new int[]{...};
    
    var result = numA.Union(numB).OrderBy(num => num); // add .Distinct() if you like