【问题标题】:Why does my merge sort algorithm not sort my array correctly?为什么我的归并排序算法不能正确排序我的数组?
【发布时间】:2019-10-04 11:24:10
【问题描述】:

我目前正在尝试使用合并排序对一些整数进行排序,但我的算法有问题。 我有一个较大的文件,其中包含我应该排序的整数,但我使用了一个较小的给定数组来检查它是否在对较大的文件进行排序之前工作。

我的 THIS 算法的输出是:1 2 2 2 4 5 6,但它应该是:1 2 4 5 6 9 10 ??

这是我得到的:

private static int[] data = new int[] { 1, 9, 10, 2, 4, 5, 6 };

static void Main(string[] args)
{
   int N = data.Length;
   Sort(data, 0, N - 1);
   for (int i = 0; i < N; i++)
       Console.WriteLine(data[i]);
}

private static void Merge(int[] intArray, int lo, int mid, int hi)
{
   int i = lo;
   int j = mid + 1;
   if (intArray.Length != 0)
       for (int k = lo; k <= hi; k++)
           data[k] = intArray[k];
   for (int k = lo; k <= hi; k++)
   {
       if (i > mid)
           intArray[k] = data[j++];
       else if (j > hi)
           intArray[k] = data[i++];
       else if (data[j] < data[i])
           intArray[k] = data[j++];
       else if (data[i] < data[j])
           intArray[k] = data[i++];
   }
}

private static void Sort(int[] intArray, int lo, int hi)
{
   if (hi <= lo)
       return;
   int mid = lo + (hi - lo) / 2;
   Sort(intArray, lo, mid);
   Sort(intArray, mid + 1, hi);
   Merge(intArray, lo, mid, hi);
} 

【问题讨论】:

  • data[k] = intArray[k]; -- dataintArray同一个数组,所以这一行什么也不做(它与data[k] = data[k] 完全相同,因为@987654326 @ 指向与 data 相同的数组。我怀疑您的问题来自对 C# 引用类型如何工作的误解。
  • 感谢您的回复!我想要在这部分实现的唯一一件事是,如果数组中只有 1 个或更少的元素,则无需再进行排序。那么它应该是相同的数组。如果我用 for 循环注释掉整个 if 语句,输出仍然是一样的。

标签: c# merge mergesort


【解决方案1】:

我认为问题出在 C# 中的数组引用中,正如@canton7 所说,试试这个代码:

private static int[] data = new int[] { 1, 9, 10, 2, 4, 5, 6 };
private static int[] intArray;

static void Main()
{
    int N = data.Length;
    intArray = new int[N];
    Sort(0, N - 1);
    for (int i = 0; i < N; i++)
        Console.WriteLine(intArray[i]);
}

private static void Merge(int lo, int mid, int hi)
{
    int i = lo;
    int j = mid + 1;      
    for (int k = lo; k <= hi; k++)
    {
        if (i > mid)
            intArray[k] = data[j++];
        else if (j > hi)
            intArray[k] = data[i++];
        else if (data[j] < data[i])
            intArray[k] = data[j++];
        else if (data[i] < data[j])
            intArray[k] = data[i++];
    }
    if (intArray.Length != 0)
        for (int k = lo; k <= hi; k++)
            data[k] = intArray[k];
}

private static void Sort(int lo, int hi)
{
    if (hi == lo)
        return;
    int mid = lo + (hi - lo) / 2;
    Sort(lo, mid);
    Sort(mid + 1, hi);
    Merge(lo, mid, hi);
}

【讨论】:

  • 非常感谢!这对我帮助很大。它现在运行良好。真的很感激!
  • 不客气,只是避免在 C# 中处理数组,因为它们将在方法之间复制。不幸的是,这并没有发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多