C # реализует алгоритм сортировки сегментов - PullRequest
0 голосов
/ 25 мая 2018

Добрый вечер всем здесь!Я создал алгоритм сортировки сегментов, но он выдает ошибку, что индекс выходит за пределы допустимого диапазона.Не могли бы вы сказать мне, где проблема?Я не могу найти решение самостоятельно, поэтому прошу вашей помощи

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 ]

0 голосов
/ 25 мая 2018

Я не уверен, какую логику вы применили для сортировки, но я понял, почему вы получаете индекс из-за ошибки диапазона.

Ошибка в коде

Высоздавая 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;
}

Вы должны сделать

Постарайтесь решить свою проблему с помощью тяжелых попыток, прежде чем обращаться за помощью.Сначала запустите вашу программу на бумаге, я имею в виду, подтвердите вашу логику, прежде чем начинать кодировать.Верьте в себя и уделяйте достаточно времени своим попыткам.Наслаждайтесь кодированием.

0 голосов
/ 25 мая 2018

Прежде чем ответить, я хочу настоятельно рекомендовать вам всегда добросовестно пытаться решить проблему, прежде чем обращаться за помощью извне.Я не обязательно думаю, что вы не пробовали, но эту проблему легко выявить, пройдя через отладчик.

Если с этим аспектом кодирования вы не слишком знакомы, я настоятельно рекомендую сделать его приоритетным для изучения - в конечном итоге это сделает вас лучшим разработчиком.

В этот момент в методе Scatter возникает проблема:

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

Исключение происходит потому, что GetBucketNumber умножает вход на 10, но вы используете это умноженное значение какиндекс для buckets.

...