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

时间:2015-03-22 23:15:45

标签: 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;



        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)

上面的部分没问题,但下面我有一个例外。

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

接下来的几行很好。

        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;

接下来的几行都给了我例外。

            MergeSort_Recursive(numbers, left, mid);

            MergeSort_Recursive(numbers, (mid + 1), right);

            DoMerge(numbers, left, (mid + 1), right);

据我所知,其余的都很好,但我会添加它,以便你们可以看到。

        }

    }

    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();
    }
}

我正在尝试阅读的文本文件有500个数字,最高数字为999,最小数字为6,数字非常随机,我必须对它们进行排序。 附:我知道超出范围异常是什么,我知道是什么导致它,因此我问为什么我的代码抛出异常。

1 个答案:

答案 0 :(得分:1)

您的排序代码看起来很好。我在一个小阵列上运行它并正确排序。

您的代码中存在两个导致超出范围异常的问题。

第一个问题是您将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数组时,您创建的数组长度为25。 这将解决这个问题:

int[] temp = new int[numbers.Length];

请注意,更好的方法是在主函数中创建temp数组,并将其作为参数传递给MergeSort_Recursive()DoMerge(),这样您就没有了在每个合并操作上创建一个新数组。