java - 列表列表中的堆算法实现

标签 java algorithm arraylist data-structures heaps-algorithm

我正在使用 Heap 的算法创建一个列表列表,其中包含所述列表的每个排列。每个排列都是它自己的列表。当我在算法中打印它时它可以正常工作,但是当我尝试将它添加到我的列表列表并且它们都是相同的数组(4、1、2、3)时它不能正常工作。我注释掉了我测试过的打印品,以确保它能正常工作。

我当前的代码:

public static ArrayList<int[]> lists = new ArrayList<>();

public static void main(String[] args) {
    int[] list = {1,2,3,4};
    heapsAlgorithm(4,list);
    for(int i = 1; i <= lists.size(); i++) {
        System.out.println("List " + i + ": " + Arrays.toString(lists.get(i-1)));
    }
}

public static void heapsAlgorithm(int n, int[] list) {
    if (n == 1) {
        lists.add(list);
        //System.out.println(Arrays.toString(list));
    }
    else {
        for(int i = 0; i < n; i++) {
            heapsAlgorithm(n - 1, list);
            if ( n % 2 == 0) {
                int swap = list[i];
                list[i] = list[n-1];
                list[n-1] = swap;
            }
            else {
                int swap = list[0];
                list[0] = list[n-1];
                list[n-1] = swap;
            }
        }
    }
}

工作:

[1, 2, 3, 4]
[2, 1, 3, 4]
[3, 1, 2, 4]
[1, 3, 2, 4]
[2, 3, 1, 4]
[3, 2, 1, 4]
[4, 2, 3, 1]
[2, 4, 3, 1]
[3, 4, 2, 1]
[4, 3, 2, 1]
[2, 3, 4, 1]
[3, 2, 4, 1]
[4, 1, 3, 2]
[1, 4, 3, 2]
[3, 4, 1, 2]
[4, 3, 1, 2]
[1, 3, 4, 2]
[3, 1, 4, 2]
[4, 1, 2, 3]
[1, 4, 2, 3]
[2, 4, 1, 3]
[4, 2, 1, 3]
[1, 2, 4, 3]
[2, 1, 4, 3]

不正确的输出:

List 1: [4, 1, 2, 3]
List 2: [4, 1, 2, 3]
List 3: [4, 1, 2, 3]
List 4: [4, 1, 2, 3]
List 5: [4, 1, 2, 3]
List 6: [4, 1, 2, 3]
List 7: [4, 1, 2, 3]
List 8: [4, 1, 2, 3]
List 9: [4, 1, 2, 3]
List 10: [4, 1, 2, 3]
List 11: [4, 1, 2, 3]
List 12: [4, 1, 2, 3]
List 13: [4, 1, 2, 3]
List 14: [4, 1, 2, 3]
List 15: [4, 1, 2, 3]
List 16: [4, 1, 2, 3]
List 17: [4, 1, 2, 3]
List 18: [4, 1, 2, 3]
List 19: [4, 1, 2, 3]
List 20: [4, 1, 2, 3]
List 21: [4, 1, 2, 3]
List 22: [4, 1, 2, 3]
List 23: [4, 1, 2, 3]
List 24: [4, 1, 2, 3]

我假设我错误地使用了我的 ArrayList,但我不确定在哪里。有什么建议吗?

最佳答案

您需要复制您的 int 数组。

您有一个数组的可变实例和您假设要保留排列的数组列表。基本上,发生了什么:

  1. 你做排列。
  2. 您向 ArrayList 添加排列。
  3. 您对同一对象进行另一个排列。
  4. 您将已经在此列表中的对象添加到 ArrayList。

最后,您有 ArrayList,其中添加了 20 次相同的 int 数组。

关于java - 列表列表中的堆算法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46245677/

相关文章:

java - 如何将 csv 文件截断为 n 行而不读取整个文件

java - 读取可能更改的图像文件路径

java - 如何使用 JDBC 访问 Oracle 表统计信息,特别是 NUM_ROWS 和 AVG_ROW_LEN?

c++ - 如何权衡精度和速度以评估 C++ 中两个 vector 的点积符号? (不是硬件特定的)

algorithm - 遍历游戏状态空间 : more search leads to bad results

java - Arraylist 删除重名并修改另一个 arraylist

java - Hive JDBC - getConnection 失败时连接泄漏

c# - 扩展基类型并自动更新实体的审计信息

java - 尝试从文件夹打印数组列表时出错

java - 如何从存储在不同文件中的 ArrayList 返回项目?