首页
学习
活动
专区
圈层
工具
发布

Java置换2
EN

Stack Overflow用户
提问于 2010-12-06 06:33:38
回答 4查看 644关注 0票数 1

大约一周前,我问了一个问题来帮助我回答这个问题。

Java permutations

,在打印排列方法中存在问题。我整理了我的代码,并有一个工作的例子,现在可以工作了,尽管如果5在数组中的第5位,它就不会打印它。任何帮助都将不胜感激。

代码语言:javascript
复制
 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(" )");
}
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-06 06:41:05

我不太热衷于

代码语言:javascript
复制
int n = p.length-1;

紧接着是

代码语言:javascript
复制
while (f < n) {

因此,如果p是5个单位长,f从0开始,那么循环将是从0到3,这似乎排除了数组中的最后一个元素。

票数 0
EN

Stack Overflow用户

发布于 2010-12-06 06:47:08

可以使用Collections类的shuffle方法

代码语言:javascript
复制
Integer[] arr = new Integer[] { 1, 2, 3, 4, 5 };
List<Integer> arrList = Arrays.asList(arr);
Collections.shuffle(arrList);
System.out.println(arrList);
票数 0
EN

Stack Overflow用户

发布于 2010-12-06 09:17:41

我不认为将每个元素与随机的其他元素交换会得到均匀分布的排列。最好从剩余的值中统一选择:

代码语言:javascript
复制
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时间内处理这项任务,但它们非常重要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4361689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档