一种组合算法的实现

一种从n个数字选出m个数字的组合,算法如下:

public class MathCombine {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		int array[]={11,22,33,44,55};
		int [][] ret=getCombine(array.length,3);
		if(null!=ret)
		{
			System.out.println("组合顺序如下:");
			for (int j = 0; j < ret.length; j++)
			{
				for (int j2 = 0; j2 < ret[j].length; j2++)
				{
					System.out.print("["+(j2+1)+"]="+(ret[j][j2]+1)+";");
				}
				System.out.print("\n");
			}

			System.out.println("\n组合结果如下:");
			for (int j = 0; j < ret.length; j++)
			{
				System.out.print("{");
				for (int j2 = 0; j2 < ret[j].length; j2++)
				{
					System.out.print(array[ret[j][j2]]+((j2==ret[j].length-1)?"":","));
				}
				System.out.print("}\n");
			}

		}
	}

	/**
	 * 从array 中选取 selectCount个 数字促成的组合,要求组合不重复
	 * @param array
	 * @param selectCount
	 */
	public static int[][] getCombine(int n, int m)
	{
		if(m <=0 || m>n)
		{
			return null;
		}
		else
		{
			int count=getallCombineCount(n,m);
			int [][] ret=new int[count][m];

			int index=0;
			int []indexArray=new int[m];
			for (int i = 0; i < indexArray.length; i++)
			{
				indexArray[i]=i;
				ret[index][i]=i;
			}

			boolean isBreak=false;
			while(!isBreak)
			{
				for (int i = m-1; i >= 0; i--)
				{
					int nextValue = indexArray[i] + 1;
					if(nextValue > n-(m-i))
					{
						if(i-1>= 0)
						{
							int preValue=indexArray[i-1]+1;
							if(preValue>n-(m-i)-1)
							{
								continue;
							}
							else
							{
								indexArray[i-1]=preValue;
								for (int j = i; j < m; j++)
								{
									if (j == m-1 )
									{
										indexArray[j]=indexArray[j-1];
									}
									else
									{
										indexArray[j]=indexArray[j-1]+1;
									}
								}
								break;
							}
						}
						else
						{
							isBreak=true;
							break;
						}
					}
					else//满足条件
					{
						indexArray[i]=nextValue;
						index++;
						for (int j = 0; j < indexArray.length; j++)
						{
							ret[index][j]=indexArray[j];
						}
						break;
					}
				}

				if(index>=count-1)
				{
					isBreak=true;
				}
			}
			return ret;
		}
	}

	/**
	 * 获取组合总数
	 * @param n
	 * @param m
	 * @return
	 */
	public static int getallCombineCount(int n, int m)
	{
		return getAllCount(n,m)/getFactorial(m);
	}

	public static int getAllCount(int n,int m)
	{
		int ret=1;
		for (int i = 0; i < m; i++)
		{
			ret*=n;
			n--;
		}
		return ret;
	}

	public static int getFactorial(int m)
	{
		return m*(m>1?getFactorial(m-1):1);
	}
}

输出结果如下:

一种组合算法的实现,布布扣,bubuko.com

时间: 2024-10-25 09:18:30

一种组合算法的实现的相关文章

七种排序算法的实现和总结

最近把七种排序算法集中在一起写了一遍. 注释里有比较详细的说明. 1 /*排序算法大集合**/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 //------------------快速排序------------------// 7 /* 8 核心: 9 如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置. 10 算法: 11 1.选取分界数,参考这个分界数,

数组的几种排序算法的实现

转自: http://blog.csdn.net/letthinking/article/details/6764996 . 数组的排序方法有很多,效率也各不相同,下面简单介绍一下几种常见的排序算法. 1.选择排序法:将要排序的数组分成两部分,一部分是从大到小已经排好序的,一部分是无序的,从无序的部分取出最小的放到已经排序的最后面.实现如下: [java] view plaincopy public int[] choiceSort(int[] arr){ for(int i = 0;i < a

几种排序方法的实现(更新中)

插入排序: 1).直接插入排序: 假设当前排序到了第i个元素arr[i],则此时i左侧[0,i-1]已经有序,对于arr[i]来说,如果arr[i]>=arr[i-1],则不用排序,直接进入[i+1];否则要在左侧有序表中找到一个合适的位置j令arr[j]<=arr[i]<arr[j+1]. 每一趟插入排序,令当前有序表的长度增加1,直至有序长度等于数组长度. class Solution { public: void InsertSort(vector<int>&

Python - 几种排序算法的实现

直接插入.选择排序.冒泡排序.快速排序.……归并排序.基数排序.希尔.堆排序. 直接插入: 思想是:1.将数据序列分成两部分,前一部分是有序的,后面一部分是无序的. 2.将无序变有序,首先从第一开始,然后第一,第二比较后排序,此时这两位就是有序的了:然后从无序的队列中取出第三位和第二位比较,然后他们中矮的再和第一位比较,此时三位是有序的: 然后再取出第四位,和前面的比较……,一直到最后一位比较. def insert_sort(aList): n = len(aList) for i in ra

【转】三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)

原文:http://blog.csdn.net/left_la/article/details/8206405 快速排序的三个步骤: 1.分解:将数组A[l...r]划分成两个(可能空)子数组A[l...p-1]和A[p+1...r],使得A[l...p-1]中的每个元素都小于等于A(p),而且,小于等于A[p+1...r]中的元素.下标p也在这个划分过程中计算. 2.解决:通过递归调用快速排序,对数组A[l...p-1]和A[p+1...r]排序. 3.合并:因为两个子数组时就地排序,将它们的

[搜索]一种分词方法的实现

加上有一句话,thisisabook,要将之分成合适的单词,假设有一个字典,这个字典包含单词. 我刚看到这个需求,第一反应是用搜索中的分词方式,最大匹配法,后来经过高人指点,说不用,只需要遇到正确的单词就分出来,然后又想到了回溯法,再次经高人指点,回溯也不需要,只需要递归即可.下面是简单的实现代码,供参考: char *dict[]={"a","is","book","boo","this"}; bool

几种常用的排序算法

什么是算法 我想很多程序员恐怕误解了「算法」的意义,一想到算法就是动态规划,机器学习之类的高大名词.算法其实就是数学中的「解题过程」,解题过程要求精确,考虑各种情况,需要人看得懂.算法不需要你在键盘上选择什么编程语言实现,只需要在本子上详细的写出每一个步骤就可以了. 算法真的很重要吗? 我经常在社区里看到有人说初级开发不需要懂算法,这是非常真切的,很多的业务构建都是很常规的套路,查个数据库返回,没有太多复杂的计算,哪需要什么解题过程. 但是我想遇到稍微复杂一点的业务,或者想要系统运行得更流畅.更

图论(二):图的四种最短路径算法

本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,弗洛伊德算法,迪杰斯特拉算法,Bellman-Ford算法 1),深度或广度优先搜索算法(解决单源最短路径)从起始结点开始访问所有的深度遍历路径或广度优先路径,则到达终点结点的路径有多条,取其中路径权值最短的一条则为最短路径. 下面是核心代码: void dfs(int cur, int dst){ /***operation***/ /***operation***/ if(minPath < dst) return;//当前走过路

IP多播(组播)

IP多播是实现数据一对多通信的模式.从一个源点传送到多个目的地,数据仅仅拷贝一份.这里说的数据仅仅拷贝一份,是指在每一条须要它的两个点之间,数据仅仅有一份.例如以下图为<计算机网络>(谢希仁)第五版中单播与多播示意图. 因特网上的多播成为IP多播. 多播组 实现多播,必定就须要有多播组.多播组须要有自己的标识符.而多播组IP即为多播组的标识符,一个多播组IP代表一个多播组. D类IP地址即为多播组IP地址.D类地址前四位为1110,范围是 224.0 .0 .0到 239. 255. 255.