- // 调用方法如下:
- //
- // 1.GetPermutation(T[], startIndex, endIndex)
- // 返回从startIndex到endIndex的排列
- //
- // 2.GetPermutation(T[])
- // 返回数组所有元素的全排列
- //
- // 版本历史:
- // V0.1 2010-01-20 摘要:首次创建
- //
- //-----------------------------------------------------------------------------
- using System;
- using System.Collections.Generic;
- namespace Arithmetic
- {
- public class Permutation<T>
- {
- /// <summary>
- /// 交换两个变量
- /// </summary>
- /// <param name="a">变量1</param>
- /// <param name="b">变量2</param>
- public static void Swap(ref T a, ref T b)
- {
- T temp = a;
- a = b;
- b = temp;
- }
- /// <summary>
- /// 递归算法求排列(私有成员)
- /// </summary>
- /// <param name="list">返回的列表</param>
- /// <param name="t">原始数组</param>
- /// <param name="startIndex">起始标号</param>
- /// <param name="endIndex">结束标号</param>
- private static void GetPermutation(ref List<T[]> list, T[] t, int startIndex, int endIndex)
- {
- if (startIndex == endIndex)
- {
- if (list == null)
- {
- list = new List<T[]>();
- }
- T[] temp = new T[t.Length];
- t.CopyTo(temp, 0);
- list.Add(temp);
- }
- else
- {
- for (int i = startIndex; i <= endIndex; i++)
- {
- Swap(ref t[startIndex], ref t[i]);
- GetPermutation(ref list, t, startIndex + 1, endIndex);
- Swap(ref t[startIndex], ref t[i]);
- }
- }
- }
- /// <summary>
- /// 求数组的排列
- /// </summary>
- /// <param name="t">原始数组</param>
- /// <param name="startIndex">起始标号</param>
- /// <param name="endIndex">结束标号</param>
- /// <returns>从起始标号到结束标号的排列</returns>
- public static List<T[]> GetPermutation(T[] t, int startIndex, int endIndex)
- {
- if (startIndex < 0 || endIndex > t.Length - 1)
- {
- return null;
- }
- List<T[]> list = new List<T[]>();
- GetPermutation(ref list, t, startIndex, endIndex);
- return list;
- }
- /// <summary>
- /// 求数组的排列
- /// </summary>
- /// <param name="t">原始数组</param>
- /// <returns>全排列</returns>
- public static List<T[]> GetPermutation(T[] t)
- {
- return GetPermutation(t, 0, t.Length - 1);
- }
- }
- }
调用:
- int[] arr = new int[5];
- for (int i = 0; i < arr.Length; i++)
- {
- arr[i] = i + 1;
- }
- List<int[]> list = Arithmetic.Permutation<int>.GetPermutation(arr);