日期:2014-05-20 浏览次数:21069 次
//----------------------------------------- // // 算法:排列类 // // 版权所有(C) Snowdust // 个人博客 http://blog.csdn.net/snwodust & http://snowdust.cnblogs.com // MSN & Email snwodust77@sina.com // // 此源代码可免费用于各类软件(含商业软件) // 允许对此代码的进一步修改与开发 // 但必须完整保留此版权信息 // // 调用方法如下: // // 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);