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

问题描述 投票:0回答:1

我目前正试图通过Merge Sort对一些整数进行排序,但是我的算法有问题。我有一个较大的文件,应该对整数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);
} 
c# merge mergesort
1个回答
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.