예제 #1
0
        private int Partition(int begin, int end)
        {
            dNode <T> pivot = GetNode(end);

            int i = begin - 1;

            for (int j = begin; j < end; j++)
            {
                if (GetNode(j).GetValue().CompareTo(pivot.GetValue()) < 0)
                {
                    i++;
                    Swap(i, j);
                }
            }
            Swap(i + 1, end);

            return(i + 1);
        }
예제 #2
0
        //Swap two elements in the DLL
        public void Swap(int first, int second)
        {
            //If one of the elements is out of range throw exception
            if (first < 0 || second < 0 || first >= size || second >= size)
            {
                throw new System.ArgumentException("Index out of bounds", "original");
            }
            //If elements are equal no swap required
            else if (first != second)
            {
                dNode <T> firstNode  = GetNode(first);
                dNode <T> secondNode = GetNode(second);
                dNode <T> temp       = new dNode <T>(firstNode.GetValue());
                temp.next = firstNode.next;
                temp.prev = firstNode.prev;

                //If elements are consecutive
                if (firstNode.prev == secondNode)
                {
                    if (secondNode.prev != null)
                    {
                        if (firstNode.next != null)
                        {
                            firstNode.next.prev = secondNode;
                        }
                        firstNode.prev       = secondNode.prev;
                        secondNode.prev.next = firstNode;
                        secondNode.next      = firstNode.next;
                        secondNode.prev      = firstNode;
                        firstNode.next       = secondNode;
                    }
                    else
                    {
                        if (firstNode.next != null)
                        {
                            firstNode.next.prev = secondNode;
                        }
                        secondNode.next = firstNode.next;
                        secondNode.prev = firstNode;
                        firstNode.next  = secondNode;
                        firstNode.prev  = null;
                        head            = firstNode;
                    }
                }
                else if (firstNode.next == secondNode)
                {
                    Swap(second, first);
                }
                //If elements are different
                else
                {
                    if (firstNode.prev != null)
                    {
                        dNode <T> firstPrev = firstNode.prev;
                        firstPrev.next = secondNode;
                    }
                    else
                    {
                        head = secondNode;
                    }

                    if (firstNode.next != null)
                    {
                        dNode <T> firstNext = firstNode.next;
                        firstNext.prev = secondNode;
                    }
                    else
                    {
                        tail = secondNode;
                    }
                    if (secondNode.prev != null)
                    {
                        dNode <T> secondPrev = secondNode.prev;
                        secondPrev.next = firstNode;
                    }
                    else
                    {
                        head = firstNode;
                    }

                    if (secondNode.next != null)
                    {
                        dNode <T> secondNext = secondNode.next;
                        secondNext.prev = firstNode;
                    }
                    else
                    {
                        tail = firstNode;
                    }

                    firstNode.next  = secondNode.next;
                    firstNode.prev  = secondNode.prev;
                    secondNode.next = temp.next;
                    secondNode.prev = temp.prev;
                }
            }
        }