private int GetPartition <TEntity, T>(IList <TEntity> list, int from, int to, OrderSettings <TEntity, T> orderSettings)
        {
            TEntity pivot = list[to];

            int lowestIndex = from - 1;

            for (int i = from; i < to; i++)
            {
                if (orderSettings.Direction == OrderDirection.Asc)
                {
                    if (orderSettings.Compare(pivot, list[i]) > 0)
                    {
                        lowestIndex++;
                        list.Swap(lowestIndex, i);
                    }
                }
                else
                {
                    if (orderSettings.Compare(pivot, list[i]) < 0)
                    {
                        lowestIndex++;
                        list.Swap(lowestIndex, i);
                    }
                }
            }

            lowestIndex++;
            list.Swap(lowestIndex, to);

            return(lowestIndex);
        }
Beispiel #2
0
        private static void Sort <TEntity, T>(IList <TEntity> list, int from, int middle, int to, OrderSettings <TEntity, T> orderSettings)
        {
            int firstSize  = middle - from + 1;
            int secondSize = to - middle;

            var firstArray  = new TEntity[firstSize];
            var secondArray = new TEntity[secondSize];

            for (int i = 0; i < firstSize; i++)
            {
                firstArray[i] = list[from + i];
            }

            for (int i = 0; i < secondSize; i++)
            {
                secondArray[i] = list[middle + i + 1];
            }

            int firstIndex = 0, secondIndex = 0;

            int resultIndex = from;

            while (firstIndex < firstSize && secondIndex < secondSize)
            {
                if (orderSettings.Direction == OrderDirection.Asc)
                {
                    if (orderSettings.Compare(firstArray[firstIndex], secondArray[secondIndex]) <= 0)
                    {
                        list[resultIndex] = firstArray[firstIndex];
                        firstIndex++;
                    }
                    else
                    {
                        list[resultIndex] = secondArray[secondIndex];
                        secondIndex++;
                    }
                }
                else
                {
                    if (orderSettings.Compare(firstArray[firstIndex], secondArray[secondIndex]) >= 0)
                    {
                        list[resultIndex] = firstArray[firstIndex];
                        firstIndex++;
                    }
                    else
                    {
                        list[resultIndex] = secondArray[secondIndex];
                        secondIndex++;
                    }
                }

                resultIndex++;
            }

            while (firstIndex < firstSize)
            {
                list[resultIndex++] = firstArray[firstIndex++];
            }

            while (secondIndex < secondSize)
            {
                list[resultIndex++] = secondArray[secondIndex++];
            }
        }