说明
全排列算法、gcd最大公约数算法、最小公倍数算法、knuth洗牌算法。
代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Stack;
/**
* 一些有趣的算法
*
* @author ncu_ht
*/
public class FunningAlgorithm {
/**
* 获取下标的全排列
*
* @param length 下标长度
* @return 下标的全排列
*/
public static List<List<Integer>> getAllElementCompose(int length) {
List<List<Integer>> list = new ArrayList<>();
Stack stack = new Stack<>();
allElementCompose(list, stack, length);
return list;
}
/**
* 计算全排列
*
* @param list 全排列
* @param stack 保存中间结果的栈
* @param length 全排列元素长度
*/
private static void allElementCompose(List<List<Integer>> list, Stack stack, int length) {
if (stack.size() == length) {
list.add(new ArrayList<Integer>(stack));
return;
}
for (int i = 0; i < length; i++) {
if (!stack.contains(i)) {
stack.push(i);
allElementCompose(list, stack, length);
stack.pop();
}
}
}
/**
* 求最大公约数
*
* @param a 第一个数
* @param b 第二个数
* @return 最大公约数
*/
public static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
/**
* 求最小公倍数
*
* @param a 第一个数
* @param b 第二个数
* @return 最小公倍数
*/
public static int lcm(int a, int b) {
return (a * b) / gcd(a, b);
}
/**
* knuth洗牌算法
* 核心内容:从最后一个元素开始,与未处理的部分中(包括自身)随机一个元素进行交换
*
* @param a 待洗牌的数组
*/
public static void knuth(int[] a) {
Random random = new Random();
for (int i = a.length - 1; i >= 0; i--) {
int randomInt = random.nextInt(i + 1);
int temp = a[i];
a[i] = a[randomInt];
a[randomInt] = temp;
}
}
}
1859

被折叠的 条评论
为什么被折叠?



