C# 合并排序文本文件读取器中的索引超出范围异常

C# 合并排序文本文件读取器中的索引超出范围异常,c#,sorting,mergesort,indexoutofrangeexception,C#,Sorting,Mergesort,Indexoutofrangeexception,我正在尝试使用合并排序对文本文件进行排序。当我尝试运行它时,我总是得到一个索引超出范围的异常。我将指定发生异常的区域 class Program { static public void DoMerge(int[] numbers, int left, int mid, int right) { int[] temp = new int[25]; int i, left_end, num_elements, tmp_pos;

我正在尝试使用合并排序对文本文件进行排序。当我尝试运行它时,我总是得到一个索引超出范围的异常。我将指定发生异常的区域

class Program
{
    static public void DoMerge(int[] numbers, int left, int mid, int right)
    {

        int[] temp = new int[25];

        int i, left_end, num_elements, tmp_pos;



        left_end = (mid - 1);

        tmp_pos = left;

        num_elements = (right - left + 1);



        while ((left <= left_end) && (mid <= right))
        {

            if (numbers[left] <= numbers[mid])

                temp[tmp_pos++] = numbers[left++];

            else

                temp[tmp_pos++] = numbers[mid++];

        }



        while (left <= left_end)

            temp[tmp_pos++] = numbers[left++];

        while (mid <= right)
接下来的几行很好

        for (i = 0; i < num_elements; i++)
        {

            numbers[right] = temp[right];

            right--;

        }

    }



    static public void MergeSort_Recursive(int[] numbers, int left, int right)
    {

        int mid;



        if (right > left)
        {

            mid = (right + left) / 2;
就我所见,其余的都很好,但我会加上它,让你们看看

        }

    }

    static void Main(string[] args)
    {
        string fileNumbers = File.ReadAllText("sort(5).txt");
        string[] intNumbers = fileNumbers.Split(new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
        int[] numbers = new int[intNumbers.Length];
        int len = 999;
        //for (int n = 0; n < intNumbers.Length; n++)
        //{
        //    numbers[n] = int.Parse(intNumbers[n]);
        //}

        Console.WriteLine("MergeSort: ");
        MergeSort_Recursive(numbers, 0, len - 1);
        for (int i = 0; i < 1; i++)
            Console.WriteLine(numbers[i]);
        Console.Read();
    }
}
}
}
静态void Main(字符串[]参数)
{
字符串fileNumbers=File.ReadAllText(“sort(5.txt”);
string[]intNumbers=fileNumbers.Split(新字符[]{','\t','\r','\n'},StringSplitOptions.RemoveEmptyEntries);
int[]number=新的int[intNumbers.Length];
int len=999;
//for(int n=0;n
我试图读取的文本文件有500个数字,最大的是999,最小的是6,这些数字非常随机,我必须对它们进行排序。
另外,我知道什么是超出范围的异常,我知道它的原因,因此我要问为什么我的代码会抛出异常。

您的排序代码看起来基本正常。我在一个小数组上运行它,它正确排序

            temp[tmp_pos++] = numbers[mid++];
代码中有两个问题导致了超出范围的异常

第一个问题是您正在将
len
设置为999

您提到该文件包含500个数字,但最好将
len
设置为
numbers.Length

static void Main(string[] args)
{
    string fileNumbers = File.ReadAllText("sort(5).txt");
    string[] intNumbers = fileNumbers.Split(new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    int[] numbers = new int[intNumbers.Length];
    int len = numbers.Length;
    for (int n = 0; n < intNumbers.Length; n++)
    {
        numbers[n] = int.Parse(intNumbers[n]);
    }

    Console.WriteLine("MergeSort: ");
    MergeSort_Recursive(numbers, 0, len - 1);
    for (int i = 0; i < numbers.Length; i++)
        Console.WriteLine(numbers[i]);

    //Console.Read(); //Not sure what this is for....
}

请注意,更好的方法是在主函数中创建
temp
数组,并将其作为参数传递给
MergeSort\u Recursive()
DoMerge()
,这样,您就不必在每次合并操作中创建新数组。

我不确定此时是否有问题,或者列表是否太长,但它从244左右开始,然后结束,我知道还有更多的数字,除此之外,一切正常,谢谢您的帮助。没问题。我想说的是,先用硬编码数组试试,让它工作,然后让它处理文件的内容。可能由于某种原因,无法成功读取文件的全部内容。另外,将
numbers.Length
写入控制台,以查看从文件中读取的数字量是否符合您的预期。我通过添加(…+“\t”)将其修复,因此它将其拆分为4列。我猜命令提示符对于所有的数字来说都不够大。再次感谢您的帮助。@Dour High Arch不,我知道什么是索引超出范围异常。所以这不是重复,我确实在另一个人的帮助下解决了这个问题,并在下面发布了一个答案,但请不要在你没有阅读问题时就妄下结论。
static void Main(string[] args)
{
    string fileNumbers = File.ReadAllText("sort(5).txt");
    string[] intNumbers = fileNumbers.Split(new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    int[] numbers = new int[intNumbers.Length];
    int len = numbers.Length;
    for (int n = 0; n < intNumbers.Length; n++)
    {
        numbers[n] = int.Parse(intNumbers[n]);
    }

    Console.WriteLine("MergeSort: ");
    MergeSort_Recursive(numbers, 0, len - 1);
    for (int i = 0; i < numbers.Length; i++)
        Console.WriteLine(numbers[i]);

    //Console.Read(); //Not sure what this is for....
}
int[] temp = new int[numbers.Length];