java版
package com.swfml.test;
/**
* 生成从m中取n个数的全排列(m > n > 0)
* <p>思路:
* <p>取n的数的全排列可看做数组值从(以从1到5取3个数为例)
* <p>1, 2, 3
* <p>变化到
* <p>5, 4, 3
* @author SavageGarden
*
*/
public class Test {
/**
* M值
*/
public static int M = 5;
/**
* N值
*/
public static int N = 4;
/**
* 记录数组(排列组合)的最小状态位
*/
public static int[] arrayMin = new int[N];
/**
* 记录数组(排列组合)的最大状态位
*/
public static int[] arrayMax = new int[N];
/**
* 初始化数组(排列组合)的最小状态位
*/
public static void initArrayMin() {
for(int i = 0; i < N; i ++) {
arrayMin[i] = i + 1;
}
}
/**
* 初始化数组(排列组合)的最大状态位
*/
public static void initArrayMax() {
for(int i = 0; i < N; i ++) {
arrayMax[i] = M - i;
}
}
/**
* 打印输出数组(排列组合)
* @param array
*/
public static void printArray(int[] array) {
for(int i = 0; i < array.length; i ++) {
System.out.print(array[i] + "\t");
}
System.out.println();
}
/**
* 判断数值在数组中(索引之前)是否存在
* @param array 数组
* @param index 索引
* @param value 数值
* @return
*/
public static boolean checkExit(int[] array, int index, int value) {
for(int i = 0; i <= index; i ++) {
if(array[i] == value) {
return true;
}
}
return false;
}
/**
* 获取数组(排列组合)当前索引的下一个位置的值
* @param array
* @param index
* @return
*/
public static int getNextValue(int[] array, int index) {
for(int i = 0; i < M; i ++) {
if(!checkExit(array, index, i + 1)) {
return i + 1;
}
}
return 0;
}
/**
* 根据数组(排列组合)的状态位,返回下一个数组(排列组合)的状态位
* @param array
* @param index
*/
public static int[] getNextArray(int[] array, int index) {
int value = array[index] + 1;
while(checkExit(array, index, value)) {
value ++;
}
if(value <= M) {
array[index] = value;
if(index < N - 1) {
while(index < N - 1) {
value = getNextValue(array, index);
index ++;
array[index] = value;
}
}
return array;
} else {
index--;
if(index == -1) {
return null;
}
return getNextArray(array, index);
}
}
public static void getAll() {
initArrayMin();
initArrayMax();
printArray(arrayMin);
int[] temp;
while((temp = getNextArray(arrayMin, N - 1)) != null) {
printArray(temp);
}
printArray(arrayMax);
}
public static void main(String args[]) {
getAll();
}
}
JavaScript版
<html>
<body>
<div id="message"/>
</body>
</html>
<script>
//M值
var M = 5;
//N值
var N = 3;
//记录数组(排列组合)的最小状态位
var arrayMin = new Array(N);
//记录数组(排列组合)的最大状态位
var arrayMax = new Array(N);
var message = "<textarea cols='100' rows='50'>";
/**
* 初始化数组(排列组合)的最小状态位
*/
function initArrayMin() {
for(var i = 0; i < N; i ++) {
arrayMin[i] = i + 1;
}
}
/**
* 初始化数组(排列组合)的最大状态位
*/
function initArrayMax() {
for(var i = 0; i < N; i ++) {
arrayMax[i] = M - i;
}
}
/**
* 打印输出数组(排列组合)
* @param array
*/
function printArray(array) {
for(var i = 0; i < array.length; i ++) {
message += array[i] + "\t";
}
message += "\n";
}
/**
* 判断数值在数组中(索引之前)是否存在
* @param array 数组
* @param index 索引
* @param value 数值
* @return
*/
function checkExit(array, index, value) {
for(var i = 0; i <= index; i ++) {
if(array[i] == value) {
return true;
}
}
return false;
}
/**
* 获取数组(排列组合)当前索引的下一个位置的值
* @param array
* @param index
* @return
*/
function getNextValue(array, index) {
for(var i = 0; i < M; i ++) {
if(!checkExit(array, index, i + 1)) {
return i + 1;
}
}
return 0;
}
/**
* 根据数组(排列组合)的状态位,返回下一个数组(排列组合)的状态位
* @param array
* @param index
*/
function getNextArray(array, index) {
var value = array[index] + 1;
while(checkExit(array, index, value)) {
value ++;
}
if(value <= M) {
array[index] = value;
if(index < N - 1) {
while(index < N - 1) {
value = getNextValue(array, index);
index ++;
array[index] = value;
}
}
return array;
} else {
index--;
if(index == -1) {
return null;
}
return getNextArray(array, index);
}
}
function getAll() {
initArrayMin();
initArrayMax();
printArray(arrayMin);
var temp;
while((temp = getNextArray(arrayMin, N - 1)) != null) {
printArray(temp);
}
message += "</textarea>";
document.getElementById("message").innerHTML = message;
}
getAll();
</script>
C版
#include <stdio.h>
#define M 5
#define N 4
/* 记录数组(排列组合)的最小状态位 */
int arrayMin[N];
/* 记录数组(排列组合)的最大状态位 */
int arrayMax[N];
void initArrayMin();
void initArrayMax();
void printArray(int *array);
int checkExit(int *array, int index, int value);
int getNextValue(int *array, int index);
int *getNextArray(int *array, int index);
void getAll();
/* 初始化数组(排列组合)的最小状态位 */
void initArrayMin()
{
int i;
for(i = 0; i < N; i ++)
{
arrayMin[i]= i + 1;
}
}
/* 初始化数组(排列组合)的最大状态位 */
void initArrayMax()
{
int i;
for(i = 0; i < N; i ++)
{
arrayMax[i] = M - i;
}
}
/* 打印输出数组(排列组合) */
void printArray(int *array)
{
int i;
for(i = 0; i < N; i ++)
{
printf("%d\t", *(array + i));
}
printf("\n");
}
/* 判断数值在数组中(索引之前)是否存在 */
int checkExit(int *array, int index, int value)
{
int i;
for(i = 0; i <= index; i ++) {
if(*(array + i) == value) {
return 1;
}
}
return 0;
}
/* 获取数组(排列组合)当前索引的下一个位置的值 */
int getNextValue(int *array, int index)
{
int i;
for(i = 0; i < M; i ++) {
if(!checkExit(array, index, i + 1)) {
return i + 1;
}
}
return 0;
}
/* 根据数组(排列组合)的状态位,返回下一个数组(排列组合)的状态位 */
int *getNextArray(int *array, int index)
{
int value = *(array + index) + 1;
while(checkExit(array, index, value) == 1) {
value ++;
}
if(value <= M) {
*(array + index) = value;
if(index < N - 1) {
while(index < N - 1) {
value = getNextValue(array, index);
index ++;
*(array + index) = value;
}
}
return array;
} else {
index--;
if(index == -1) {
return NULL;
}
return getNextArray(array, index);
}
}
void getAll()
{
initArrayMin();
initArrayMax();
printArray(arrayMin);
int *temp;
while((temp = getNextArray(arrayMin, N - 1)) != NULL) {
printArray(temp);
}
}
void main()
{
getAll();
}