-2

マージソートを使用してテキストファイルをソートしようとしています。ただし、実行しようとすると、インデックスが範囲外の例外を取得し続けます。例外が発生する領域を指定します。

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)

上記の部分は問題ありませんが、以下に 1 つの例外があります。

            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 です。数字はかなりランダムなので、並べ替える必要があります。PS範囲外例外とは何かを知っており、その原因を知っているため、コードが例外をスローする理由を尋ねている理由です。

4

1 に答える 1

1

あなたのソートコードはほとんど問題ないようです。小さな配列で実行したところ、正しくソートされました。

範囲外の例外の原因となっているコードには 2 つの問題があります。

最初の問題は、len999 に設定していることです。

ファイルには 500 個の数字が含まれているとおっしゃいましたがlennumbers.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....
}

2 番目の問題は、temp配列を作成するときに、長さ 25 で作成していることです。これにより、その部分が修正されます。

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

マージ操作ごとに新しい配列を作成する必要がないようにtemp、メイン関数で配列を作成し、パラメーターとして and に渡すMergeSort_Recursive()方がよいことに注意してください。DoMerge()

于 2015-03-23T03:02:20.507 に答える