static void CallPermutation()
        {
            string[] source = { "0", "1", "2", "3" };
            //string[] source = { "ant", "bat", "cow", "dog" };
            //StringPerm stringPerm = new StringPerm(a);

            for (StringPerm p = new StringPerm(source); p != null; p = p.Successor())
            {
                Console.WriteLine(p.ToString());
            }
        }
        public StringPerm Successor() // assumes no duplicate atoms
        {
            StringPerm result = new StringPerm(this.element);
            int        left, right;

            left = result.order - 2;  // Step #1 - Find left value
            while ((result.element[left].CompareTo(result.element[left + 1])) > 0 && (left >= 1))
            {
                --left;
            }
            if ((left == 0) && (this.element[left].CompareTo(this.element[left + 1])) > 0)
            {
                return(null);
            }

            right = result.order - 1;  // Step #2 - find right; first value > left
            while (result.element[left].CompareTo(result.element[right]) > 0)
            {
                --right;
            }

            string temp = result.element[left];  // Step #3 - swap [left] and [right]

            result.element[left]  = result.element[right];
            result.element[right] = temp;

            int i = left + 1;              // Step #4 - reverse order the tail
            int j = result.order - 1;

            while (i < j)
            {
                temp = result.element[i];
                result.element[i++] = result.element[j];
                result.element[j--] = temp;
            }

            //return result;
            return(result);
        } // Successor()