定义
排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;
全排列:当n==m时,称为全排列;
Main class
static void Main(string[] args)
{
List<String> mylist = new List<string> { "1", "2", "3" };
Combination.Permutation(mylist,0,2);
Console.ReadLine();
}
Permutation class
/// <summary>
/// 对数组进行全排列
/// </summary>
/// <param name="lsArray">要进行全排列的数组</param>
/// <param name="begin">进行全排列的开始下标</param>
/// <param name="end">进行全排列的结束下标</param>
/// can't have duplicate number
/* Permutation(lsArray{1,2,3} ,0,2} begin=0. 最外层的begin 不会变的
* i=0 end=2 ; exec swap({1,2,3},begin=0,i=0) =>lsArray{1,2,3} ;Permutation(lsArray{1,2,3}, 1, 2);
* i=1 exec swap({1,2,3},begin=1,i=1) =>lsArray{1,2,3} ;Permutation(lsArray{1,2,3}, 2, 2);
* i=2 print {1,2,3} return last level
* exec swap({1,2,3},begin=1,i=1) 还原回去 {1,2,3}
* i=2 exec swap({1,2,3},begin=1,i=2) =>lsArray{1,3,2} ;Permutation(lsArray{1,3,2}, 2, 2);
* i=2 print {1,3,2} return last level
* exec swap({1,3,2},begin=1,i=2) 还原回去 {1,2,3}
* i=3 i<=end break out
* i=1 end=2 ; exec swap({1,2,3},begin=0,i=1) =>lsArray{2,1,3} ;Permutation(lsArray{2,1,3}, 1, 2);
* i=1 exec swap({2,1,3},begin=1,i=1) =>lsArray{2,1,3} ;Permutation(lsArray{2,1,3}, 2, 2);
* i=2 print {2,1,3} return last level
* exec swap({2,1,3},begin=1,i=1) 还原回去 {2,1,3}
* i=2 exec swap({2,1,3},begin=1,i=2) =>lsArray{2,3,1} ; Permutation(lsArray{2,3,1}, 2, 2);
* i=2 print {2,3,1} return last level
* exec swap({2,3,1},begin=1,i=2) 还原回去 {2,1,3}
* i=3 i<=end break out
* i=2 end=2 ; exec swap({2,1,3},begin=0,i=2) =>lsArray{3,1,2} ;Permutation(lsArray{3,1,2}, 1, 2);
* i=1 exec swap({3,1,2},begin=1,i=1) =>lsArray{3,1,2} ;Permutation(lsArray{3,1,2}, 2, 2);
* i=2 print {3,1,2} return last level
* exec swap({3,1,2},begin=1,i=1) 还原回去 {3,1,2}
* i=2 exec swap({3,1,2},begin=1,i=2) =>lsArray{3,2,1} ; Permutation(lsArray{3,2,1}, 2, 2);
* i=2 print {3,2,1} return last level
* exec swap({3,2,1},begin=1,i=1) 还原回去 {3,1,2}
* i=3 i<=end break out
*
*
*/
public static void Permutation(List<string> lsArray, int begin, int end)
{
if (begin == end)
{
for (int i = 0; i <= end; i++)
Console.Write(" {0} ", lsArray[i]);
Console.WriteLine();
}
for (int i = begin; i <= end; i++)
{
Swap(lsArray, begin, i);//for循环将每个数放到begin位置中去
Permutation(lsArray, begin + 1, end);//假设begin位置确定,那么对begin+1 到end中的数继续递归,其实重复上一步,为了把数据能够依次替换放入begin的位置
Swap(lsArray, begin, i); //换过去后再还原
}
}
/// <summary>
/// 交换数组中的下标为x,y的值
/// </summary>
/// <param name="lsArray">该数组</param>
/// <param name="x"></param>
/// <param name="y"></param>
private static void Swap(List<string> lsArray, int x, int y)
{
string t = lsArray[x];
lsArray[x] = lsArray[y];
lsArray[y] = t;
}
总结:
1如果是有重复的元素,无法剔除。
2 迭代比较难懂,自己写不出来。