本文主要介绍了java的两种全排列的效率比较,方法二比方法一效率高很多,可能还有其它方法,但是目前不会。
全排列方法一
import java.util.ArrayList;
import java.util.List;
public class Main{
static int count=0;//记录合理排序的次数
static List<Integer> list= new ArrayList<>(); //用来存放一种可能的排列结果
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};//拟排列数组
long startTime=System.currentTimeMillis();//获取开始时间
fullsort(arr,arr.length,0);//进入函数开始计算
System.out.println(count);//打印最终排列次数
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");//程序运行时间
}
public static void fullsort(int[] arr,int n,int cur) {//全排列算法(数组,一种排列结果总的个数,当前的个数)
if(n==cur) {//当前结果等于需要的排列个数,开始计数
count++;
}
for(int i=0;i<arr.length;i++) {
if(!list.contains(arr[i])) {//如果list不包含arr[i],则进行下一步,因为全排列不能有arr[]中重复的
list.add(arr[i]);
fullsort(arr,n,cur+1);
list.remove(list.size()-1);//出递归后,需要移除之前增加的数,进行下一次循环
}
}
}
}
结果为:(不同的计算机,不同的时间有不同的结果)
362880
程序运行时间: 239ms
函数执行时间大致为239ms
全排列方法二
public class Main {
static int count=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1,2,3,4,5,6,7,8,9};
long startTime=System.currentTimeMillis(); //获取开始时间
fun(arr,0,arr.length);
System.out.println(count);
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
public static void fun(int[] arr,int start,int end) {
if(start==end) {
count++;
}
int temp =0;
for(int i=start;i<end;i++) {//下面几行不好理解,有兴趣可以百度【java全排列】,网上很多的
temp=arr[start];//这行和下面两行是交换arr中start位置和i位置的数据
arr[start]=arr[i];
arr[i]=temp;
fun(arr,start+1,end);
temp=arr[start];//这行和下面两行是交换arr中start位置和i位置的数据
arr[start]=arr[i];
arr[i]=temp;
}
}
}
结果为:(不同的计算机,不同的时间有不同的结果)
362880
程序运行时间: 11ms
函数执行时间大致为11ms
总结
可以看出方法二的运行速度比方法一快很多,以后用全排的时候就用第二种,我也不知其原因,了解的小伙伴欢迎请指教,留言。