• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 详解C#的排列组合

详解C#的排列组合

作者:逆心 字体:[增加 减小] 来源:互联网 时间:2017-05-28

逆心 通过本文主要向大家介绍了c语言32关键字详解,c语言链表详解,c语言指针详解,c语言题库及详解答案,c语言关键字详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

排列组合的概念

排列:从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement)。

组合:从m个不同的元素中,任取n(n≤m)个元素为一组,叫作从m个不同元素中取出n个元素的一个组合。

排列组合实现代码

上一个项目做的一个水路的路径规划时,用到了排列的数据结构。求任意N个点里M个点的不同顺序的组合个数。

这样求最优路径。下面贴一段不知道哪里找的排列组合的算法。

public class PermutationAndCombination<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="n">辅助变量</param>
 /// <param name="m">辅助变量</param>
 /// <param name="b">辅助数组</param>
 /// <param name="M">辅助变量M</param>
 private static void GetCombination(ref List<T[]> list, T[] t, int n, int m, int[] b, int M)
 {
 for (int i = n; i >= m; i--)
 {
 b[m - 1] = i - 1;
 if (m > 1)
 {
 GetCombination(ref list, t, i - 1, m - 1, b, M);
 }
 else
 {
 if (list == null)
 {
 list = new List<T[]>();
 }
 T[] temp = new T[M];
 for (int j = 0; j < b.Length; j++)
 {
 temp[j] = t[b[j]];
 }
 list.Add(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);
 }
 /// <summary>
 /// 求数组中n个元素的排列
 /// </summary>
 /// <param name="t">所求数组</param>
 /// <param name="n">元素个数</param>
 /// <returns>数组中n个元素的排列</returns>
 public static List<T[]> GetPermutation(T[] t, int n)
 {
 if (n > t.Length)
 {
 return null;
 }
 List<T[]> list = new List<T[]>();
 List<T[]> c = GetCombination(t, n);
 for (int i = 0; i < c.Count; i++)
 {
 List<T[]> l = new List<T[]>();
 GetPermutation(ref l, c[i], 0, n - 1);
 list.AddRange(l);
 }
 return list;
 }
 /// <summary>
 /// 求数组中n个元素的组合
 /// </summary>
 /// <param name="t">所求数组</param>
 /// <param name="n">元素个数</param>
 /// <returns>数组中n个元素的组合的范型</returns>
 public static List<T[]> GetCombination(T[] t, int n)
 {
 if (t.Length < n)
 {
 return null;
 }
 int[] temp = new int[n];
 List<T[]> list = new List<T[]>();
 GetCombination(ref list, t, t.Length, n, temp, n);
 return list;
 }
 }
</div>

    求组合:求5个数里任意3个数的组合

 static void Main(string[] args)
 {
 int[] IntArr = new int[] { 1, 2, 3, 4, 5 }; //整型数组
 List<int[]> ListCombination = PermutationAndCombination<int>.GetCombination(IntArr, 3); //求全部的3-3组合
 foreach(int[] arr in ListCombination)
 {
 foreach(int item in arr)
 {
 Console.Write(item + " ");
 }
 Console.WriteLine("");
 }
 Console.ReadKey();
 }
</div>

求排列:5个数取3个的任意排列

 int[] IntArr = new int[] { 1, 2, 3, 4, 5 }; //整型数组
 List<int[]> ListCombination = PermutationAndCombination<int>.GetPermutation(IntArr, 3); //求全部的5取3排列
 foreach(int[] arr in ListCombination)
 {
 foreach(int item in arr)
 {
 Console.Write(item + " ");
 }
 Console.WriteLine("");
 }
</div>

以上就是本文的全部内容,希望对大家有所帮助!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解C#中三个关键字params,Ref,out
  • 详解三种C#实现数组反转方式
  • 详解C# 利用反射根据类名创建类的实例对象
  • 详解C#用new和override来实现抽象类的重写区别
  • 详解C#把DataTable中数据一次插入数据库的方法
  • 详解c# 类的构造方法
  • 详解C#多线程之线程同步
  • 详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿
  • 详解C#中的委托
  • 详解C#中的out和ref

相关文章

  • 2017-05-28C#设置WinForm中DataGrid列的方法(列宽/列标题等)
  • 2017-05-28C#使用linq计算执行元素在列表中出现次数的方法
  • 2017-05-28C#转换日期类型实例
  • 2017-05-28C#中的yield关键字的使用方法介绍
  • 2017-05-28C#实现文件与二进制互转并存入数据库
  • 2017-05-28关于C#生成MongoDB中ObjectId的实现方法
  • 2017-05-28C#设计模式编程中运用适配器模式结构实战演练
  • 2017-05-28C#中使用ADOMD.NET查询多维数据集的实现方法
  • 2017-05-28浅析C#中StringBuilder类的高效及与String的对比
  • 2017-05-28C#实现把指定数据写入串口

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c# 空合并运算符“??”的使用详解
    • C#正则表达式的6个简单例子
    • C#中观察者模式的3种实现方式
    • C#中GridView动态添加列的实现方法
    • C# DoubleClick与MouseDoubleClick区别,双击事件引发顺序
    • C#实现通过模板自动创建Word文档的方法
    • 浅谈c# 泛型类的应用
    • C# 利用StringBuilder提升字符串拼接性能的小例子
    • C#使用正则表达式实现首字母转大写的方法
    • 详解C#中的Async和Await用法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有