生成一系列数字的所有排列序列

时间:2013-10-17 01:21:50

标签: java algorithm set

给出了以下算法,我们应该在java中写出来。但是,当我尝试逐行理解时,它会让人感到困惑,尤其是部分:

  

A [k + 1:N-1] = S中的值按升序

据我所知,该套装在任何时候只有1个号码。当集合只有1个数字时,我们如何替换A[k+1:N-1]

设A是一个整数序列0N-1的升序(让我们假设它是一个int[N]数组。)

next_permutation(A):
    k = N-1
    S = { }
    while k >= 0:
        if S contains a value larger than A[k]:
            v = the smallest member of S that is larger than A[k]
            remove v from S
            insert A[k] in S
            A[k] = v
            A[k+1:N-1] = the values in S in ascending order.
            return true
        else:
            insert A[k] in S
            k -= 1
    return false

1 个答案:

答案 0 :(得分:1)

显示的算法类似于Generation in lexicographic order。您可以阅读该文章以获取更多信息。

  

@templatetypedef关于如何用升序中的值替换数组中的项目的任何线索?例如A [k + 1:N-1] = S中的值按升序排列。我应该使用toArray()?

这不是必需的。您可以尝试始终对S数组进行排序。每次要在数组中插入新数字时,都要将其插入到数组中,这样数组就可以保持排序状态。 例如,如果您到目前为止S = [5 7 8]并且想要插入6,则插入5到7之间 - S = [5 6 7 8]。这样,替换步骤只是将元素从S复制到A [k + 1:N-1]。