bugfix> c# > 投稿

みなさんこんばんは!バケットソートアルゴリズムを作成しましたが、インデックスが範囲外であるというエラーがスローされます。問題はどこにあるのか教えてください。私は自分で解決策を見つけることができません、だから私はあなたの助けを求めています

public int[] Sort(int[] unsortedSequence)
        {
            List<List<int>> buckets = new List<List<int>>();
            InitializeBuckets(buckets);
            Scatter(unsortedSequence, buckets);
            int i = 0;
            foreach (List<int> bucket in buckets)
            {
                int[] arr = bucket.ToArray();
                InsertionSort(arr);
                foreach (int d in arr)
                {
                    unsortedSequence[i++] = d;
                }
            }
            return unsortedSequence;
        }
        private static void Scatter(int[] array, List<List<int>> buckets)
        {
            foreach (int value in array)
            {
                int bucketNumber = GetBucketNumber(value);
                buckets[bucketNumber].Add(value);
            }
        }
        private static void InsertionSort(int[] array)
        {
            int j;
            int temp;
            for (int i = 1; i < array.Length; i++)
            {
                j = i;
                while (j > 0 && array[j] < array[j - 1])
                {
                    temp = array[j];
                    array[j] = array[j - 1];
                    array[j - 1] = temp;
                    j--;
                }
            }
        }
        private static int GetBucketNumber(int value)
        {
            int val = value * 10;
            return val;
        }
        private static void InitializeBuckets(List<List<int>> buckets)
        {
            for (int i = 0; i < 10; i++)
            {
                List<int> a = new List<int>();
                buckets.Add(a);
            }
        }

回答 2 件
  • これをソートするためにどのようなロジックを実行したかはわかりませんが、インデックスが範囲外エラーになる理由はわかりました。

    コードのエラー

    10個のバケットを作成し、現在の値または配列に10を掛けてバケット番号を生成しようとしています。

    たとえば、配列の現在の値が2である場合、生成されるバケット番号は20になります。バケットは10個だけなので、 Scatter()  メソッドはあなたにエラーを与えます。

    private static void Scatter(int[] array, List<List<int>> buckets)
     {
         foreach (int value in array)
         {
             int bucketNumber = GetBucketNumber(value);
             buckets[bucketNumber].Add(value); // ERROR HERE
         }
     }
    
    

    解決

    実際、 GetBucketNumber() に問題があります  方法。乗算ではなく剰余を使用する必要があります。次の方法で変更します。

    private static int GetBucketNumber(int value)
    {
        int val = value % 10;
        return val;
    }
    
    

    しなければならない

    助けを求める前に、懸命に試みて問題を解決してください。最初にプログラムを紙で実行します。コーディングを開始する前にロジックを確認します。あなたを信じて、あなたの試みに十分な時間を与えてください。コーディングをお楽しみください。

  • 私が答える前に、外部の助けを求める前に常に問題を解決しようと誠実に試みることを強くお勧めします。私は必ずしもあなたが試みなかったとは思わないが、この問題はデバッガーをステップスルーすることで簡単に特定された。

    それがあまり馴染みのないコーディングの側面である場合、学習することを優先することを強くお勧めします-それはあなたを長期的にはより良い開発者にするだけです。

    問題は Scatter で発生しています  この時点での方法:

    int bucketNumber = GetBucketNumber(value); buckets[bucketNumber].Add(value);

    例外が発生するのは、 GetBucketNumber  入力に10を乗算しますが、その乗算値を buckets のインデックスとして使用しています 。

あなたの答え