为什么我的合并排序算法不能正确地对数组排序?

时间:2019-10-04 11:24:10

标签: c# merge mergesort

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

我从 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);
} 

1 个答案:

答案 0 :(得分:2)

我认为问题出在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);
}