
數組的排列
數組的排列是以不同順序排列數組元素的所有可能方式。例如,陣列[1, 2, 3] 具有以下排列:
- [1, 2, 3]
- [1, 3, 2]
- [ 2, 1, 3]
- [2, 3, 1]
- [3, 1, 2]
- [3, 2, 1]
有多種演算法可以產生陣列的排列。最常見的演算法之一是遞歸演算法,它透過將新元素添加到較小數組的每個排列的末尾來產生較小數組的所有排列。
這裡是Java 中遞歸演算法的實作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import java.util.List;
public class Permute {
public static void main(String[] args) {
int[] a = new int[]{3, 4, 6, 2, 1};
permute(a, 0);
}
static void permute(int[] a, int k) {
for (int i = k; i < a.length; i++) {
java.util.Collections.swap(a, i, k);
permute(a, k + 1);
java.util.Collections.swap(a, i, k);
}
if (k == a.length - 1) {
System.out.println(java.util.Arrays.toString(a));
}
}
}
|
登入後複製
上面的程式碼將陣列a 的所有排列列印到console.
處理重複元素
上面的遞歸演算法無法正確處理重複元素。例如,如果陣列 a 包含重複的元素,那麼演算法將產生重複的排列。
為了處理重複的元素,我們可以使用稱為堆演算法的不同演算法。 Heap 演算法透過迭代交換數組的兩個元素來產生數組的所有排列。
這是 Heap 演算法在 Java 中的實作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import java.util.List;
public class Permute {
public static void main(String[] args) {
int[] a = new int[]{3, 3, 4, 4, 6, 2, 1};
permute(a, 0);
}
static void permute(int[] a, int k) {
if (k == a.length - 1) {
System.out.println(java.util.Arrays.toString(a));
} else {
for (int i = k; i < a.length; i++) {
if (i == k || a[i] != a[k]) {
java.util.Collections.swap(a, i, k);
permute(a, k + 1);
java.util.Collections.swap(a, i, k);
}
}
}
}
}
|
登入後複製
上面的程式碼列印所有唯一的排列將陣列 a 發送到控制台。
以上是如何產生數組的所有唯一排列,包括處理重複元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!