C#字符串全排序

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;

全排列:当n==m时,称为全排列;

比如:集合{ 1,2,3}的全排列为:

{ 1 2 3}

{ 1 3 2 }

{ 2 1 3 }

{ 2 3 1 }

{ 3 2 1 }

{ 3 1 2 }

我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致;

算法思路:

(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);

(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;

(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;

 

 static void Main(string[] args)
        {
            string s = "123";
            char[] str = s.ToCharArray();
            perm(str, 0, s.Length);
            //permNotSame(str, 0, s.Length);
        }

        /// <summary>
        /// 全排序
        /// </summary>
        /// <param name="a"></param>
        /// <param name="begin"></param>
        /// <param name="end"></param>
        static void perm(char[] a, int begin, int end)
        {
            if (begin == end)
            {               
                for (int i = 0; i < begin; i++)
                {
                    Console.Write(a[i]);                   
                }
                Console.WriteLine("");
            }
            else
            {
                for (int j = begin; j < end; j++)
                {
                    swap(a, begin, j);
                    perm(a, begin + 1, end);
                    swap(a, j, begin);
                }
            }
        }


        /// <summary>
        /// 交换数组 索引x和y位置的值
        /// </summary>
        /// <param name="a"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        static void swap(char[] a, int x, int y)
        {
            char temp = a[x];
            a[x] = a[y];
            a[y] = temp;
        }       

  测试结果:

 

posted @ 2017-05-24 18:26  lance2008  阅读(884)  评论(0编辑  收藏  举报