#c# #sorting
#c# #сортировка
Вопрос:
Поэтому я написал реализацию сортировки по корзинам (я использую rnd.NextDouble()
для заполнения своего массива, чтобы все элементы находились в диапазоне от 0 до 1). И у меня есть количество экспериментов (10 экспериментов для каждого размера массива) и разные размеры массива (я начинаю с 1000, а затем 1000 и т. Д. До 300 000). И иногда это работает нормально, но иногда это дает мне исключение из правил:
public static void BucketSortImplement(ref int countOfElements, ref float[] array) { Listlt;floatgt;[] buckets = new Listlt;floatgt;[countOfElements]; for (int i = 0; i lt; countOfElements; i ) { buckets[i] = new Listlt;floatgt;(); } for (int i = 0; i lt; countOfElements; i ) { float indexOfElement = array[i] * countOfElements; buckets[(int)indexOfElement].Add(array[i]); // right here } for (int i = 0; i lt; countOfElements; i ) { for (int j = 0; j lt; buckets[i].Count; j ) { float keyElement = buckets[i][j]; int k = j - 1; while (k gt;= 0 amp;amp; buckets[i][k] gt; keyElement) { buckets[i][k 1] = buckets[i][k]; k -= 1; } buckets[i][k 1] = keyElement; } } int arrayIndex = 0; for (int i = 0; i lt; countOfElements; i ) { for (int j = 0; j lt; buckets[i].Count; j ) { array[arrayIndex ] = buckets[i][j]; } } }
Я немного сбит с толку, потому что сам алгоритм выглядит нормально, то есть я должен рассчитать array[i] * countOfElements
, чтобы получить индекс, в который я могу поместить свой элемент. Не могли бы вы, пожалуйста, направить меня?
Ответ №1:
Если ваш массив содержит значение «1», это приведет к выходу за пределы диапазона, потому что, если размер списка равен 3 (например), допустимые индексы будут находиться в диапазоне [0, 2].
Комментарии:
1. Функция nextDouble() возвращает случайное число с плавающей запятой, которое больше или равно 0,0 и МЕНЬШЕ 1,0.
2. Максимальное значение следующей двойки составляет 0,99999999999999978. Если вы бросите его на плаву, вы получите 1.0.
3. Черт возьми, это интересно, сегодня я узнал кое-что еще.
4. @SergeyMiryanov Вау, большое тебе спасибо! Это решило мою проблему)