Example #1
0
        public void Sort <TComparer> (TComparer comparer, int[] indices = null)
            where TComparer : IRefComparer <T>
        {
            if (_HasList)
            {
                if (indices != null)
                {
                    Items.IndexedSortRef(comparer, indices);
                }
                else
                {
                    Items.FastCLRSortRef(comparer);
                }

                return;
            }

            if (_Count <= 1)
            {
                return;
            }

            T a, b;

            if (comparer.Compare(ref Item1, ref Item2) <= 0)
            {
                a = Item1; b = Item2;
            }
            else
            {
                a = Item2; b = Item1;
            }

            if (_Count == 2)
            {
                Item1 = a;
                Item2 = b;
                return;
            }
            else if (_Count == 3)
            {
                if (comparer.Compare(ref b, ref Item3) <= 0)
                {
                    Item1 = a;
                    Item2 = b;
                }
                else if (comparer.Compare(ref a, ref Item3) <= 0)
                {
                    Item1 = a;
                    Item2 = Item3;
                    Item3 = b;
                }
                else
                {
                    Item1 = Item3;
                    Item2 = a;
                    Item3 = b;
                }
            }
            else
            {
                T c, d;
                if (comparer.Compare(ref Item3, ref Item4) <= 0)
                {
                    c = Item3; d = Item4;
                }
                else
                {
                    c = Item4; d = Item3;
                }

                T m1;
                if (comparer.Compare(ref a, ref c) <= 0)
                {
                    Item1 = a;
                    m1    = c;
                }
                else
                {
                    Item1 = c;
                    m1    = a;
                }

                T m2;
                if (comparer.Compare(ref b, ref d) >= 0)
                {
                    Item4 = b;
                    m2    = d;
                }
                else
                {
                    Item4 = d;
                    m2    = b;
                }

                if (comparer.Compare(ref m1, ref m2) <= 0)
                {
                    Item2 = m1;
                    Item3 = m2;
                }
                else
                {
                    Item2 = m2;
                    Item3 = m1;
                }
            }
        }