日期:2014-05-20  浏览次数:20976 次

[散分][分享]写了个C#的排列类
由于项目中需要,就写了个排列类,代码如下:
C# code
//-----------------------------------------
//
// 算法:排列类
//
// 版权所有(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);
        }
    }
}


调用:

C# code
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);


本人水平有限,不足之处恳请指正,另外如果有什么建议,请提出。

由于N年前以前学习数据结构的时候根本没有用心,最近在研究C#描述的数据结构和算法,还写了一些小东西,比如计算24点、迷宫最短路径和计算表达式的算法,如果大家需要我将在整理之后帖出来[每帖300分]。

------解决方案--------------------
sf
------解决方案--------------------
学习了!
------解决方案--------------------