Example #1
0
        // Есть построитель, который все это инициирует и строит
        public void Build()
        {
            min = KeyFunction(sequence.Element(start).Get());
            max = KeyFunction(sequence.Element(start + number - 1).Get()); //TODO: Что-то надо делать при number == 0
            // Особый случай, когда n_scale < 1 или min == max. Тогда делается одна ячейка и особая функция
            if (n_scale < 1 || min == max)
            {
                n_scale    = 1;
                starts     = new long[1];
                starts[0]  = start;
                ToPosition = (int key) => 0;
            }
            else
            {
                starts     = new long[n_scale];
                ToPosition = (int key) => (int)(((long)key - (long)min) * (long)(n_scale - 1) / (long)((long)max - (long)min));
            }
            // Заполнение количеств элементов в диапазонах
            foreach (var ob in sequence.ElementValues(start, number))
            {
                int key      = KeyFunction(ob);
                int position = ToPosition(key);
                // Предполагаю, что начальная разметка массива - нули
                starts[position] += 1;
            }
            // Заполнение начал диапазонов
            long sum = start;

            for (int i = 0; i < n_scale; i++)
            {
                long num_els = starts[i];
                starts[i] = sum;
                sum      += num_els;
            }
        }