-1
using System;

namespace MergeSort
{
    class Program
    {
        static int[] vektor = { 5, 7, 8, 9, 1, 2, 23, 4 };
        static int[] delVektor;
        static int counter = 0;

        static void Main(string[] args)
        {
            PrintVektor(vektor);
            Merge(0, vektor.Length - 1);
            Console.WriteLine("--------");
            PrintVektor(vektor);
            Console.ReadKey();
        }

        static void PrintVektor(int[] vektor)
        {
            foreach (var item in vektor)
            {
                Console.WriteLine(item.ToString() + " ");
            }
        }

        static void Merge(int start, int stop)
        {
            if (start >= stop)
                return;

            int middle = (start + stop) / 2;

            Merge(start, middle);
            Merge(middle + 1, stop);

            delVektor = new int[stop - start + 1];

            int indexStart = start;
            int indexStop = middle + 1;

            while (indexStart <= middle && indexStop <= stop)
            {
                if (vektor[indexStart] < vektor[indexStop])
                {
                    delVektor[counter] = vektor[indexStart];
                    indexStart++;
                    counter++;
                }

                else
                {
                    delVektor[counter] = vektor[indexStop];
                    indexStop++;
                    counter++;
                }
            }

            while (indexStart <= middle)
            {
                delVektor[counter] = vektor[indexStart];
                indexStart++;
                counter++;
            }

            while (middle <= stop)
            {
                delVektor[counter] = vektor[indexStop]; // <---- here i get index out of range
                indexStop++;
                counter++;
            }

            for (int i = 0; i <= delVektor.Length - 1; i++)
            {
                vektor[start + i] = delVektor[i];
            }
        }
    }
}

問題は、インデックスが範囲外の例外を取得することです(コードにコメントしました)、

while (middle <= stop) {
  delVektor[counter] = vektor[indexStop]; // <---- here i get index out of range
  indexStop++; counter++;
}

わからない

何が間違っているのかわかりません。私はこのコードをずっと見つめているので、修正しようとしたらすぐにコンピューターをウィンドウから外したいと思っています。

4

4 に答える 4

1

これがあなたの問題です:

if (start >= stop)
            return;

        int middle = (start + stop) / 2;

        Merge(start, middle);
        Merge(middle + 1, stop);

単にマージセグメントをスキップすることになってreturnいる場合は、そうするべきではありません。start>=stop修正は次のとおりです。

int middle = (start + stop) / 2;
if (start < stop){

        Merge(start, middle);
        Merge(middle + 1, stop);
}
//...put the rest of the code which you already have here
于 2012-05-21T22:03:30.987 に答える
1

コードを修正しました。(多分)

using System;

namespace MergeSort{
    class Program{
        static int[] vektor = { 5, 7, 8, 9, 1, 2, 23, 4 };
        static int[] delVektor;
        static int counter = 0;

        static void Main(string[] args){
            PrintVektor(vektor);
            Merge(0, vektor.Length - 1);
            Console.WriteLine("--------");
            PrintVektor(vektor);
            Console.ReadKey();
        }

        static void PrintVektor(int[] vektor){
            foreach (var item in vektor)
                Console.Write(item.ToString() + " ");
            Console.WriteLine("");
        }

        static void Merge(int start, int stop){
            if (start >= stop)
                return;

            int middle = (start + stop) / 2;

            Merge(start, middle);
            Merge(middle + 1, stop);

            delVektor = new int[stop - start + 1];
            counter = 0;//add

            int indexStart = start;
            int indexStop = middle + 1;

            while (indexStart <= middle && indexStop <= stop){
                if (vektor[indexStart] < vektor[indexStop]){
                    delVektor[counter] = vektor[indexStart];
                    indexStart++;
                    counter++;
                } else {
                    delVektor[counter] = vektor[indexStop];
                    indexStop++;
                    counter++;
                }
            }

            while (indexStart <= middle){
                delVektor[counter] = vektor[indexStart];
                indexStart++;
                counter++;
            }

            while (indexStop <= stop){//edit
                delVektor[counter] = vektor[indexStop];
                indexStop++;
                counter++;
            }

            for (int i = 0; i <= delVektor.Length - 1; i++){
                vektor[start + i] = delVektor[i];
            }
        }
    }
}
于 2012-05-22T15:20:40.020 に答える
0

配列へのインデックスを使用していて、そのインデックスをインクリメントする場合、そのインデックスが実際に配列の範囲内にあるかどうかをテストする必要があります(コードの0ベースのインデックス)。

インデックスをテストして、範囲を超えないことを確認していますか?

于 2012-05-21T19:57:59.357 に答える
0

例外が発生しているループで使用している条件を確認してください。最初のエントリで条件が真の場合、それは永久に真になることに注意してください。そうすれば、修正は明白になるはずです。(ヒント:ループ本体の何も変更しないでください。)

于 2012-05-21T20:32:32.530 に答える