全排列算法java实现

来源:互联网 发布:pdas软件下载 编辑:程序博客网 时间:2024/05/01 23:41

/** * 全排列算法使用说明: * 1.集合元素按升序排序, 不要有重复的元素 * 2.在do{}while(next_permutation())中进行调用 *  * 算法原理说明:  * 1.从集合的最后一个元素进行比较, 查找最大的逆序序列, 并返回最大逆序列的起始位置, 如果起始位置等于0, 表示排列结束返回false * 2.查找逆序列开始前一个元素F在逆序中的后继数S的位置i, 即满足   a[i] < F < a[i+1] * 3.交换F和S * 4.将逆序列反序 * 5.返回true *  * */public class Permutation<T extends Comparable<T>>{    public boolean next_permutation(T[] array){   int start=findReverseOrderStart(array);   if(start == 0){    return false;   }   int precursor = start-1; // 逆序的前驱元素索引   int find=findSucceed(array,array[precursor], start);   swap(array, precursor, find); // 交换位置   reverse(array, start, array.length-1);   return true;  }    private int findReverseOrderStart(T[] array){   for (int i = array.length-1; i > 0; i--) {    if(array[i].compareTo(array[i-1])>0){     return i;    }   }   return 0;  }    /**   * 从start开始查找最后一个指定值大的值的下标   * @param array   * @param v   * @param s   * @return   */  private int findSucceed(T[] a,T v, int s){   int find=0;   for(int i=s;i<a.length;i++){    if(v.compareTo(a[i])<0){     find=i;    }   }   return find;  }    private void swap(Object[] array, int a, int b){   Object temp=array[a];   array[a]=array[b];   array[b]=temp;  }    private void reverse(T[] array, int begin, int end){   while(begin < end){    swap(array, begin++, end--);   }    }@Test public void test(){  Permutation<Integer> perm=new Permutation<Integer>();   Integer[] letters={1,2,3,4,5};  int count=0;  do{   for (int i : letters) {    System.out.print(i);   }   System.out.println();   count++;  }while(perm.next_permutation(letters));  System.out.println("permutation counts is " + count); } } //end class

0 0