Permutation of Numbers in Java

2025年4月2日 | 阅读 8 分钟

在本节中,我们将创建一个Java程序查找数字的排列和循环排列。在继续本节之前,首先我们将通过示例理解排列

排列

在数学中,排列是一种方法或技术,通过它可以确定集合中可能的排列。在考虑顺序的情况下选择和排列项目的数量。简而言之,排列就是排列的数量。在确定排列时,请牢记顺序。它用字母P表示。

换句话说,这是一种技术,通过它可以按特定顺序从给定的 n 个对象中排列(或选择)r 个对象。

在数学上,我们可以使用以下公式找到数字的排列

Permutation of Numbers in Java

其中,

P: P 是排列的数量。

n: n 是集合中对象的总数。

r: r 是从集合中选择对象的数量。

!: 这个符号表示阶乘。

例如,如果 XYZ 是一个单词,那么该单词的可能排列是

XYZ, XZY, YXZ, YZX, ZXY, ZYX

因此,我们可以以六种不同的方式排列单词 XYZ。

让我们看一个示例。

示例:有六个人参加短剧表演。有多少种方式可以颁发一等奖和二等奖?

解决方案

给定

n=6, r=2, P=?

根据上述公式

Permutation of Numbers in Java

分子和分母中都出现了 4, 3, 2, 1,因此它们被抵消了。

P(6,2)=6*5

P(6,2)=30

因此,有 30 种可能的奖项组合方式来颁发一等奖和二等奖。

让我们在 Java 程序中实现上述方法。

PermutationExample1.java

输出

Enter the Value of n and r: 
7 4
The permutation of P(n, r) = 840

让我们创建另一个 Java 程序,查找大于自身数字的数字 n 的排列。

PermutationExample2.java

输出

132
213
231
312
321

使用 Heap 算法

这是一个迭代算法。通过使用 Heap 算法,我们可以找到 n 个对象的所有排列。

  • 该算法生成前 n-1 个元素 (n-1)! 的排列,并将最后一个元素附加到每个排列中。这将生成所有以最后一个元素结尾的排列。
  • 如果 n 是奇数,则交换第一个和最后一个元素;如果 n 是偶数,则交换第 i 个元素(i 是从 0 开始的计数器)和最后一个元素,并重复上述算法直到 i 小于 n。
  • 在每次迭代中,该算法将生成所有以当前最后一个元素结尾的排列。

让我们用 Java 程序实现该算法。

PermutationExample3.java

输出

8 2 6 7 
2 8 6 7 
6 8 2 7 
8 6 2 7 
2 6 8 7 
6 2 8 7 
7 2 6 8 
2 7 6 8 
6 7 2 8 
7 6 2 8 
2 6 7 8 
6 2 7 8 
7 8 6 2 
8 7 6 2 
6 7 8 2 
7 6 8 2 
8 6 7 2 
6 8 7 2 
7 8 2 6 
8 7 2 6 
2 7 8 6 
7 2 8 6 
8 2 7 6 
2 8 7 6

使用递归算法

递归算法使用回溯。它通过每次迭代交换一个元素来确定数字的排列。

Permutation of Numbers in Java

让我们用 Java 程序实现该算法。

PermutationExample4.java

输出

come
coem
cmoe
cmeo
cemo
ceom
ocme
ocem
omce
omec
oemc
oecm
moce
moec
mcoe
mceo
meco
meoc
eomc
eocm
emoc
emco
ecmo
ecom

随机算法

我们也可以应用随机算法来确定数字的排列。当 n 的值很大时使用它。该算法通过混洗数组来生成排列。对于混洗,Java Collections 类提供了 shuffle() 方法

shuffle() 方法使用默认的随机源随机排列指定的 List。它以向后(从最后一个元素到第二个元素)的方向遍历列表。它将选定的元素与当前位置随机交换。该方法运行时间为线性。该方法的签名是

生成循环排列

由单个循环组成的排列称为循环排列。它以固定的偏移量移动集合的所有元素。该技术可以应用于任何整数,以 任意数量的位置循环右移或左移。如果一个集合的元素为 {a, b, c},则

  • 循环排列向左移动一位生成:{c, a, b}
  • 循环排列向右移动一位生成:{a, b, c}

假设 n 是要查找其循环排列的数字。我们可以通过以下步骤找到循环排列。它生成下一个排列。

我们执行上述步骤,直到得到原始数字。一旦我们得到原始数字,我们就停止执行上述步骤并返回余数。

例如,求以下分数的除法

2/7 = 0.285714...

4/7 = 0.571428...

1/7 = 0.142857...

让我们创建一个 Java 程序,生成所有可能的循环排列。

PermutationExample5.java

输出

9871
1987
7198
8719

下一个主题Void-keyword-in-java