MergeSort()实现返回初始未排序数组

时间:2018-08-29 17:56:15

标签: c# mergesort

每次运行此命令都会返回未排序的数组。我已经放置了一些代码来通知我事情发生和未发生的地方,但是它看上去和SEEMS看起来一切正常,但实际上并没有进行任何排序。

 public static int[] MergeSort(int[] array)
    {
        if(array.Length <= 1)
        {
            return array;
        }
        (int[], int[]) p = SplitArray(array);
        int[] left = MergeSort(p.Item1);
        int[] right = MergeSort(p.Item2);
        return Merge(left, right);


    }



    public static int[] Merge(int[] low, int[] high)
    {
        int[] middle = new int[(low.Length + high.Length + 1)];
        int count = 0;
        foreach (int item in low)
        {
            Console.WriteLine("low: " + item + ',');
        }
        foreach (int item in high)
        {
            Console.WriteLine("high: " + item + ',');
        }
        int low_index = 0;
        int high_index = 0;
        while (low_index < low.Length && high_index < high.Length)
        {
            if(low[low_index] < high[high_index])
            {
                middle.SetValue(low[low_index], count);
                low_index++;
                count++;
                Console.WriteLine("Low inserted.");
            }
            else
            {
                middle.SetValue(high[high_index], count);
                high_index++;
                count++;
                Console.WriteLine("High inserted.");
            }

        }
        if (low_index == low.Length)
        {
            high.CopyTo(middle, high_index);
        }
        else
        {
            low.CopyTo(middle, low_index);
        }

        return middle;
    }


    public static (int[], int[]) SplitArray(int[] k)
    {
        int MAXINDEX = k.Length - 1;
        int count = 0;
        int[] a = new int[(MAXINDEX / 2)];
        int[] b = new int[(MAXINDEX / 2)];

        for (int i = 0; i < (MAXINDEX / 2); i++)
        {
            a[i] = k[i];
        }
        for (int i = ((MAXINDEX / 2) + 1); i < MAXINDEX; i++)
        {
            b[count] = k[i];
            count++;

        }
        return (a, b);

    }

我不知道我在哪里错了。每次回到这个方面,我可能都会因为感到非常疲倦而忽略了某些事情。我基本上打印出了应该使用控制台进行的一堆事情,这一切似乎都是正确的,我已经失去了理智。

2 个答案:

答案 0 :(得分:0)

好吧,我认为主要的错误是索引错误的high.copyTo(...)和low.copyTo(...)函数

这里是完整的源代码(经过测试):

public static int[] MergeSort(int[] array)
{
  if (array.Length <= 1)
  {
    return array;
  }

  Tuple<int[], int[]> p = SplitArray(array);

  int[] left = MergeSort(p.Item1);
  int[] right = MergeSort(p.Item2);

  return Merge(left, right);
}

public static int[] Merge(int[] low, int[] high)
{
  int[] middle = new int[low.Length + high.Length];
  int count = 0;
  foreach (int item in low)
  {
    Console.WriteLine("low: " + item + ',');
  }
  foreach (int item in high)
  {
    Console.WriteLine("high: " + item + ',');
  }
  int low_index = 0;
  int high_index = 0;
  while (low_index < low.Length && high_index < high.Length)
  {
    if (low[low_index] < high[high_index])
    {
      middle[count] = low[low_index];
      low_index++;
      count++;
      Console.WriteLine("Low inserted.");
    }
    else
    {
      middle[count] = high[high_index];
      high_index++;
      count++;
      Console.WriteLine("High inserted.");
    }

  }
  if (low_index == low.Length)
  {
    for (; count < middle.Length; count++)
    {
      middle[count] = high[high_index];
      high_index++;
    }

    // alternate: Array.Copy(high, high_index, middle, count, middle.Length - count);
  }
  else
  {
    for (; count < middle.Length; count++)
    {
      middle[count] = low[low_index];
      low_index++;
    }
    // alternate: Array.Copy(low, low_index, middle, count, middle.Length - count);
  }

  return middle;
}

public static Tuple<int[], int[]> SplitArray(int[] k)
{
  int half = k.Length / 2;
  int[] a = new int[half];
  int[] b = new int[k.Length - half];

  int k_index = 0;

  for (int i = 0; i < a.Length; i++)
  {
    a[i] = k[k_index];
    k_index++;
  }

  for (int i = 0; i < b.Length; i++)
  {
    b[i] = k[k_index];
    k_index++;
  }

  return new Tuple<int[], int[]>(a, b);
}

答案 1 :(得分:0)

在这里:代码中充满了错误,数组的长度不匹配,您每次都覆盖中间数组。

namespace MainClass
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 3, 5, 15, 22, 12, 15, 23 };

            int[] x = MergeSort(array);

            foreach (int i in x)
            {
                Console.WriteLine(i);
            }

            Console.ReadKey();
        }
    public static int[] MergeSort(int[] array)
    {
        if (array.Length <= 1)
        {
            return array;
        }
        (int[], int[]) p = SplitArray(array);
        int[] left = MergeSort(p.Item1);
        int[] right = MergeSort(p.Item2);
        return Merge(left, right);


    }



    public static int[] Merge(int[] low, int[] high)
    {
        int[] middle = new int[(low.Length + high.Length)];
        int count = 0;
        foreach (int item in low)
        {
            Console.WriteLine("low: " + item + ',');
        }
        foreach (int item in high)
        {
            Console.WriteLine("high: " + item + ',');
        }
        int low_index = 0;
        int high_index = 0;
        while (low_index < low.Length && high_index < high.Length)
        {
            if (low[low_index] < high[high_index])
            {
                middle.SetValue(low[low_index], count);
                low_index++;
                count++;
                Console.WriteLine("Low inserted.");
            }
            else
            {
                middle.SetValue(high[high_index], count);
                high_index++;
                count++;
                Console.WriteLine("High inserted.");
            }

        }
        while (high_index < high.Length)
        {
            middle[low_index + high_index] = high[high_index++];
        }
        while (low_index < low.Length)
        {
            middle[low_index + high_index] = low[low_index++];
        }

        return middle;
    }


    public static (int[], int[]) SplitArray(int[] k)
    {
        int[] a = new int[((k.Length + 1) / 2)];
        int[] b = new int[(k.Length / 2)];

        for (int i = 0; i < a.Length; i++)
        {
            a[i] = k[i];
        }
        for (int i = 0; i < b.Length; i++)
        {
            b[i] = k[i + a.Length];
        }
        return (a, b);

    }

}