如何使用java

时间:2017-08-06 20:00:50

标签: java arrays algorithm permutation

所以我正在从一门课程中做一些任务,我将把它作为练习,因为教授似乎把它们留在了网上。但是,我目前正在进行的任务让我难以理解如何找到n个数字的所有排列。他给了我们sudo代码但是我在翻译它时遇到了困难。

    public void nextPerm(int[] a,int pivot,int suc){
    suc = 0;
    pivot = 0; 
    for(int i = a.length-1;; i--){
        if( i+1 != a.length)
            if(a[i] < a[i+1]){
                pivot = i;
                break;
            } else if(pivot == 0){
                reverseArray(a,pivot);//this just reverses the array from the right of the pivot point
                System.out.println(a);
        }
    }
    for(int i = a.length-1;;i--){
        if(a[i] > a[pivot]){
            suc = i;
            break;
        }
    }
    //swap pivot and suc
    int place = a[pivot];
    a[pivot] = a[suc];
    a[place] = a[pivot];
    reverseArray(a,pivot);
    System.out.println(Arrays.toString(a));


}



private void reverseArray(int[] a,int pivot) {//make pivot the index which it will reverse to the right of
    // TODO Auto-generated method stub
    int[] place = new int[a.length-pivot-1];
    int counter = 0;
    for(int i = a.length-1; i > pivot;i--){
        place[counter] = a[i];
        counter++;
    }
    counter = 0;
    int[] hold = new int[a.length];
    for(int i = 0; i <= pivot;i++){
        hold[i] = a[i];
        counter++;
    }
    for(int i = 0; i < place.length;i++){
        hold[counter] = place[i];
        counter++;
    }

    System.out.println(Arrays.toString(hold));
}

这是我到目前为止所拥有的。基本上每次运行nextPerm时,它都会将数组调整为另一个排列。有关详情,请查看此处的页面:link to more info

摘要:nextPerm通过手动更改数组一次找到所有可能的perms。如果我不清楚,我很抱歉...我很新手。我也对此进行了研究,但是我并没有在这方面取得任何进展并且在努力。谢谢你提前。

1 个答案:

答案 0 :(得分:0)

您只需要将上一步中获得的输出作为输入传递给下一步,直到迭代所有可能的排列。这是一个解释和伪代码。

假设你有一个数组[1,2,3,4]。阵列中4个元素可能的总排列数为4!假设所有元素都是不同的。所以,只需迭代上面的nextPerm 4代码!次。

int fact = factorial(array.length);
for(int i = 0;i<fact;i++){
    int[] b  = nextPerm(array);
    array = b;
}

假设你的nextPrem返回下一个置换数组。