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; }
测试结果:
个人签名:天行健,君子以自强不息