Проблема с выводом алгоритма сортировки слиянием - PullRequest
1 голос
/ 18 декабря 2010

этот код дает вывод, но у него есть одна проблема: когда пользователь пишет 5,6 в textbox1 и 7,8 в textbox3, он выводит 5,6.я знаю, что проблема в том, что когда элементы массива заканчиваются, выведите остальные элементы другого массива, я прокомментировал строку проблемы.

отредактировано: я использовал textbox1 и textbox3 для получения элементов массивов, которые пользователь хочет объединить

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++;
    }////----->>it works untill here

    while (x > nums.Length)///this mean when the elements of nums end,out the rest of the elements in other textbox but it doesnt do anything,whats the problem ?
    {
        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;


    }

Ответы [ 2 ]

1 голос
/ 18 декабря 2010

Do (удалите свое последнее время)

while (x < nums.Length)
{
        nums2[z] = nums[x];
        z++;
        x++;
}

while (y < nums1.Length)
{
        nums2[z] = nums1[y];
        z++;
        y++;
}

поскольку вы не знаете, какие элементы массива остались, ваш текущий код все равно не работает, потому что y не имеет отношения к nums и vise verse.

Редактировать: Я копирую прошлое первым во время второго, исправляю его, удаляю последние циклы while (2 в то время как с if в них) и заменяю это.

1 голос
/ 18 декабря 2010

Оба ваших условия на while (x > nums.Length) и while (y > nums1.Length) не имеют смысла, так как этого никогда не произойдет.

В предыдущем блоке вы увеличиваете x и y до тех пор, пока они меньше , чем nums.Length или nums1.Length. Следовательно, они никогда не станут больше (не более чем равными), поэтому оба условия всегда будут ложными, и «оставшиеся» элементы не будут объединены.

Обратите внимание, что в вашей реализации mergesort есть и другие неправильные вещи, но это не входит в сферу вашего конкретного вопроса.

...