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

этот код должен работать как алгоритм сортировки слиянием, но он не работает и выдает вывод 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 ]

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

Линия

if (y > nums1.Length-1)

Не должно быть внутри

if (x > nums1.Length-1)

потому что вы хотите проверить для каждого из этих условий. Если вы выйдете из своего первого while цикла из-за x >= nums.Length - 1, вы захотите убедиться, что вы пробежали y до конца.

1 голос
/ 18 декабря 2010
  1. логика беспорядок.Вы не должны использовать 'nums2' для хранения результатов, я предлагаю вам использовать более подходящее имя.
  2. Вы назначаете num2 = new int [5]?Вы должны использовать что-то еще, если вы не знаете точную длину.например, используйте список вместо.Более низкая производительность, но она больше подходит для сортировки небольших массивов.
  3. int z = 0;это не правильный способ реализации.если у вас есть цикл while и вам нужен подсчет приращений, почему бы вам не использовать цикл for?
  4. в 'if' after 'while' вы продолжаете увеличивать z без сброса его в '0', он будет индексироваться вне диапазона

Логика намного легче достижима с помощью LINQ

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

var result = numA.Union(numB).OrderBy(num => num); // add .Distinct() if you like
1 голос
/ 18 декабря 2010

Для получения полного вывода, попробуйте

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

(хорошо, это можно сделать быстрее / приятнее / интереснее, используя Linq & String.Join или StringBuilder, но для целей тестирования этого должно быть достаточно).

Возможно, это не решит все проблемы с вашим кодом выше, но, вероятно, поможет вам легче отладить его.

...