算法——排列篇01

来源:互联网 发布:sql 2005 目录无效 编辑:程序博客网 时间:2024/05/18 03:41

排列问题:

    将数组a[]={1,2,3}的全排列打印出来,不重复数组中的元素。

    方法一:

package hello.ant;public class AlogPL {static void getAll(int array[],int index){if(index==array.length){for(int i=0;i<array.length;i++){System.out.print(array[i]+" ");}System.out.println();}else {for(int i=index;i<3;i++){swap(array, i, index);getAll(array, index+1);swap(array, i, index);}}}static void swap(int a[],int i,int index){int temp=a[i];a[i]=a[index];a[index]=temp;}public static void main(String[] args) {int array[]={1,2,3};getAll(array, 0);}}

方法二:

package hello.ant;public class AlogPL4 {public static void main(String[] args) {int array[]={1,2,3};boolean flag[]=new boolean[array.length];int result[]=new int[array.length];PL(array, result, flag, 0);}static void PL(int array[],int result[],boolean flag[],int index){if(index==result.length){for(int i=0;i<result.length;i++){System.out.print(result[i]);}System.out.println();}else {for(int i=0;i<array.length;i++){if(flag[i]){continue;}result[index]=array[i];flag[i]=true;PL(array, result, flag, index+1);flag[i]=false;}}}}
重复数组中的元素:


package hello.ant;public class AlogPL2 {static void getAll(int array[],int b[],int index){if(index==b.length){for(int i=0;i<b.length;i++){System.out.print(b[i]+" ");}System.out.println();}else {for(int i=0;i<2;i++){b[index]=array[i];getAll(array, b,index+1);}}}static void swap(int a[],int i,int index){int temp=a[i];a[i]=a[index];a[index]=temp;}public static void main(String[] args) {int array[]={1,2};int b[]=new int[array.length];getAll(array, b,0);}}


不重复元素,采用非递归的方式实现(按字典顺序)。

package hello.ant;import java.util.Arrays;public class AlogPL3 {//字典排列方式public static void main(String[] args) {int array[]={1,2,3,4};Arrays.sort(array);printArray(array);while(true){//从后往前找最先出现的逆序数对,取最小的值的下标int i=array.length-2;for(;i>=0;i--){if(array[i]<array[i+1]){break;}if(i==0){//此时数组已经是最大的数列了printArray(array);return;}}//从后往前找最先出现的比下标为i的元素值大的元素的下标j;int j=array.length-1;for(;j>=0;j--){if(array[j]>array[i]){break;}}swap(array,i,j);//交换,i,jreverse(array,i+1,array.length-1);printArray(array);}}//翻转static void reverse(int[] array, int i, int j) {// TODO Auto-generated method stub//if(i>=j){//return;//}while(i<j){swap(array, i++, j--);}}static void swap(int[] array, int i, int j) {int temp=array[i];array[i]=array[j];array[j]=temp;}//打印数组static void printArray(int array[]){for(int i=0;i<array.length;i++){System.out.print(array[i]);}System.out.println();}}

算法还是挺漫长的,不过也很有意思,写这篇文章,记录一下成长的历程。

本人参考过一下两篇博客。

http://blog.csdn.net/hymanxq/article/details/24418135

http://blog.csdn.net/zmazon/article/details/8351611


看懂后均有自己实现,感觉算法的细节思路,有很多的技巧,真是博大精深。。我辈还需努力。。。

0 0