全排列(List)实现

package Java2012大赛;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/*实现了n个数在m(n>=m)个位置上的全排列
 * */
public class 全排列List {
	static Set set = new HashSet();
	static int i;// 要排列的个数
	static int j;// 在几个位置排列
	static int num = j;// 一个定值
	static List list;
	static int count = 0;// 记录全排列的个数
	public static void main(String[] args) throws IOException {
//		File file = new File("E:" + File.separator + "txt" + File.separator
//				+ "全排列.txt");
		File file = new File("E:" + File.separator
			+ "全排列.txt");
		file.createNewFile();
		int i = Integer.parseInt(javax.swing.JOptionPane
				.showInputDialog("输入排列的个数"));
		list=new ArrayList();
		int j = Integer.parseInt(javax.swing.JOptionPane
				.showInputDialog("在几个位置排列"));
		for(int a=0;a<j;a++)
			list.add(0);
		num = j;
		fx(i, j, num);
		System.out.println(count);
	}

	private static void fx(int i, int j, int num) throws IOException {
		if (j == 1) {// 如果j==1
			for (int a = 1; a <= i; a++) {
				list.set(num - 1, a);
				for (int k = 0; k < num - 1; k++) {
					set.add(list.get(k));
				}
				set.add(list.get(num - 1));
				set.add(a);
				if (set.size() == num) {
					count++;
					System.out.println(list);
				}
				set.clear();
			}
			return;
		}
		j--;
		for (int a = 1; a <= i; a++) {
			list.set(num - j - 1, a);
			fx(i, j, num);
		}
	}
}

全排列的递归实现基于递归思想,设集合 \(R = \{r_1, r_2, \ldots, r_n\}\) 是要进行排列的 \(n\) 个元素, \(R_i = R - \{r_i\}\) , \(Perm(X)\) 表示集合 \(X\)全排列,在全排列 \(Perm(X)\) 的每一个排列前加上前缀 \(r_i\) 可得到新排列。当 \(n = 1\) 时, \(Perm(R) = (r)\) ,其中 \(r\) 是集合 \(R\) 中唯一的元素;当 \(n > 1\) 时, \(Perm(R)\) 可由 \((r_1) + Perm(R_1), (r_2) + Perm(R_2), \ldots, (r_n) + Perm(R_n)\) 构成 [^1]。 以下是不同语言的实现示例: ### C++实现 ```cpp #include<iostream> #include<assert.h> #include<string.h> using namespace std; int count=0; void swap(char &a,char &b) { int tmp; tmp=b; b=a; a=tmp; } int Full_Perm(char arr[],int k,int lenth) { assert(arr != NULL); if(k==lenth) { cout<<arr<<endl; count+=1; } else { for(int j=k;j<lenth;j++) { if(arr[k] == arr[j] && k!=j) { continue; } swap(arr[k],arr[j]); Full_Perm(arr,k+1,lenth); swap(arr[k],arr[j]); } } return count; } int main() { char str[]="ABC"; int bath=strlen(str); cout<<Full_Perm(str,0,bath)<<endl; return 0; } ``` 此代码使用 `Full_Perm` 函数递归生成字符数组的全排列,通过 `swap` 函数交换元素位置,同时使用计数器 `count` 统计全排列的数量 [^2]。 ### Java实现 ```java import java.util.Scanner; public class Permutation { public static void main(String args[]){ try { System.out.println("输入全排列的个数:"); Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); Object list[]=new Object[n]; System.out.println("依次输入全排列元素:"); for (int i=0;i<=list.length-1;i++) { String x=scanner.next(); list[i]=x; } System.out.println("全排列为:"); perm(list,0,n-1); } catch (Exception e) { } } public static void perm(Object[] list,int k,int m){ if (k==m) { for (int i=0;i<=m ;i++ ) { System.out.print(list[i]+" "); } System.out.print(" : "); } else { for (int i=k;i<=m ;i++ ) { swap(list,k,i); perm(list,k+1,m); swap(list,k,i); } } } public static void swap(Object[] list,int k,int m){ Object t=list[k]; list[k]=list[m]; list[m]=t; } } ``` 该 Java 代码通过 `perm` 函数递归生成输入元素的全排列,使用 `swap` 函数交换元素位置 [^3]。 ### C++另一种实现 ```cpp #include <iostream> #include <vector> using namespace std; void print(vector<int> arr) { int Size = arr.size(); for (int i = 0; i < Size; i++) { cout << arr[i] << ' '; } cout << endl; } void permutation(vector<int>& arr, int k) { if (k == arr.size() - 1) print(arr); else { for (int i = k; i < arr.size(); i++) { swap(arr[k], arr[i]); permutation(arr, k + 1); swap(arr[k], arr[i]); } } } int main() { vector<int> arr; for (int i = 1; i < 4; i++) { arr.push_back(i); } permutation(arr, 0); return 0; } ``` 此 C++ 代码使用 `permutation` 函数递归生成整数向量的全排列,同样使用 `swap` 函数交换元素位置 [^4]。 ### 伪代码实现 ```plaintext void Perm(int *arr, int head, int tail) { if (head == tail) { ShowArray(); } else { for (int j = head; j <= tail; j++) { Swap(arr[head], arr[j]); Perm(arr, head + 1, tail); Swap(arr[head], arr[j]); } } } ``` 伪代码描述了全排列递归实现的基本逻辑,通过交换元素位置递归生成全排列 [^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值