大约一周前,我问了一个问题来帮助我回答这个问题。
,在打印排列方法中存在问题。我整理了我的代码,并有一个工作的例子,现在可以工作了,尽管如果5在数组中的第5位,它就不会打印它。任何帮助都将不胜感激。
package permutation;
public class Permutation {
static int DEFAULT = 100;
public static void main(String[] args) {
int n = DEFAULT;
if (args.length > 0)
n = Integer.parseInt(args[0]);
int[] OA = new int[n];
for (int i = 0; i < n; i++)
OA[i] = i + 1;
System.out.println("The original array is:");
for (int i = 0; i < OA.length; i++)
System.out.print(OA[i] + " ");
System.out.println();
System.out.println("A permutation of the original array is:");
OA = generateRandomPermutation(n);
printArray(OA);
printPermutation(OA);
}
static int[] generateRandomPermutation(int n)// (a)
{
int[] A = new int[n];
for (int i = 0; i < n; i++)
A[i] = i + 1;
for (int i = 0; i < n; i++) {
int r = (int) (Math.random() * (n));
int swap = A[r];
A[r] = A[i];
A[i] = swap;
}
return A;
}
static void printArray(int A[]) {
for (int i = 0; i < A.length; i++)
System.out.print(A[i] + " ");
System.out.println();
}
static void printPermutation(int[] p)
{
int n = p.length-1;
int j = 0;
int m;
int f = 0;
System.out.print("(");
while (f < n) {
m = p[j];
if (m == 0) {
do
f++;
while (p[f] == 0 && f < n);
j = f;
if (f != n)
System.out.print(")(");
}
else {
System.out.print(" " + m);
p[j] = 0;
j = m - 1;
}
}
System.out.print(" )");
}
}发布于 2010-12-06 06:41:05
我不太热衷于
int n = p.length-1;紧接着是
while (f < n) {因此,如果p是5个单位长,f从0开始,那么循环将是从0到3,这似乎排除了数组中的最后一个元素。
发布于 2010-12-06 06:47:08
可以使用Collections类的shuffle方法
Integer[] arr = new Integer[] { 1, 2, 3, 4, 5 };
List<Integer> arrList = Arrays.asList(arr);
Collections.shuffle(arrList);
System.out.println(arrList);发布于 2010-12-06 09:17:41
我不认为将每个元素与随机的其他元素交换会得到均匀分布的排列。最好从剩余的值中统一选择:
Random rand = new Random();
ArrayList<Integer> remainingValues = new ArrayList<Integer>(n);
for(int i = 0; i < n; i++)
remainingValues.add(i);
for(int i = 0; i < n; i++) {
int next = rand.nextInt(remainingValues.size());
result[i] = remainingValues.remove(next);
}请注意,如果需要考虑运行时间的顺序,则在此容量中使用ArrayList是n平方时间。有一些数据结构可以在n log n时间内处理这项任务,但它们非常重要。
https://stackoverflow.com/questions/4361689
复制相似问题