Exemplo n.º 1
0
    static CustomElement[] SortRadix(CustomElement[] elements)
    {
        // Допълнителен помощен масив
        CustomElement[] helper = new CustomElement[elements.Length];

        // Масив брояч и масив с префикси
        int[] count    = new int[1 << Pow2];
        int[] prefixes = new int[1 << Pow2];

        // Брой групи
        int groups = (int)Math.Ceiling((double)BitsCount / (double)Pow2);

        // Битова маска за идентифициране на групи
        int mask = (1 << Pow2) - 1;

        // Алгоритъмът
        for (int c = 0, shiftRight = 0; c < groups; c++, shiftRight += Pow2)
        {
            // Нулиране на масива брояч
            for (int j = 0; j < count.Length; j++)
            {
                count[j] = 0;
            }

            // Изброяване на елементите в C-тата група
            for (int i = 0; i < elements.Length; i++)
            {
                count[(elements[i].Key >> shiftRight) & mask]++;
            }

            // Изчисляване на префиксите
            prefixes[0] = 0;
            for (int i = 1; i < count.Length; i++)
            {
                prefixes[i] = prefixes[i - 1] + count[i - 1];
            }

            // Прехвърляне на елементите от основния в
            //спомагателния масив подредени по C-тата група
            for (int i = 0; i < elements.Length; i++)
            {
                helper[prefixes[(elements[i].Key >> shiftRight) & mask]++] = elements[i];
            }

            // Копиране на спомагателния масив в основния
            //и започване отначало до последната група
            helper.CopyTo(elements, 0);
        }

        // Масивът е сортиран
        return(elements);
    }
        private static CustomElement[] SortRadix(CustomElement[] elements)
        {
            // Допълнителен помощен масив
            CustomElement[] helper = new CustomElement[elements.Length];

            // Масив брояч и масив с префикси
            int[] count = new int[1 << Pow2];
            int[] prefixes = new int[1 << Pow2];

            // Брой групи
            int groups = (int)Math.Ceiling((double)BitsCount / (double)Pow2);

            // Битова маска за идентифициране на групи
            int mask = (1 << Pow2) - 1;

            // Алгоритъмът
            for (int c = 0, shiftRight = 0; c < groups; c++, shiftRight += Pow2)
            {
                // Нулиране на масива брояч
                for (int j = 0; j < count.Length; j++)
                {
                    count[j] = 0;
                }

                // Изброяване на елементите в C-тата група
                for (int i = 0; i < elements.Length; i++)
                {
                    count[(elements[i].Key >> shiftRight) & mask]++;
                }

                // Изчисляване на префиксите
                prefixes[0] = 0;
                for (int i = 1; i < count.Length; i++)
                {
                    prefixes[i] = prefixes[i - 1] + count[i - 1];
                }

                // Прехвърляне на елементите от основния в
                // спомагателния масив подредени по C-тата група
                for (int i = 0; i < elements.Length; i++)
                {
                    helper[prefixes[(elements[i].Key >> shiftRight) & mask]++] = elements[i];
                }

                // Копиране на спомагателния масив в основния
                // и започване отначало до последната група
                helper.CopyTo(elements, 0);
            }

            // Масивът е сортиран
            return elements;
        }