0

我试图从维基百科页面了解堆的算法,我试图将图片与算法进行比较,但我似乎无法弄清楚

在此处输入图像描述

这张图片来自维基百科页面

为什么要先切换#1和#2,不应该先切换#1和#4?

我正在使用java,但这只是从维基百科复制的代码,我知道一般代码涉及切换

    if k = 1 then
        output(A)
    else
        // Generate permutations with kth unaltered
        // Initially k == length(A)
        generate(k - 1, A)

        // Generate permutations for kth swapped with each k-1 initial
        for i := 0; i < k-1; i += 1 do
            // Swap choice dependent on parity of k (even or odd)
            if k is even then
                swap(A[i], A[k-1]) // zero-indexed, the kth is at k-1
            else
                swap(A[0], A[k-1])
            end if
            generate(k - 1, A)

        end for
    end if

k最初是 4 所以它不会先切换 A[0] 和 A[3] 吗?

如果这是一个愚蠢的问题,请提前道歉......

4

1 回答 1

1

当 时k > 1,它做的第一件事就是递归。所以,电话是:

generate(4,A) calls
  generate(3,A) calls
    generate(2,A) calls
      generate(1,A) which prints A
      Now we do the processing for k==2.
      swap(0,1)
      generate(1,A) which prints the new A
      etc.
    
于 2021-03-11T04:27:02.447 回答