算法——排列篇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
看懂后均有自己实现,感觉算法的细节思路,有很多的技巧,真是博大精深。。我辈还需努力。。。
0 0
- 算法——排列篇01
- 算法理解——全排列算法
- 算法——全排列递归实现
- 递归算法——全排列
- 全排列——递归算法
- 排列算法——字典序法
- NOJ1103全排列——经典算法
- 算法思维——全排列
- 01全排列算法
- 全排列算法—基于OC
- 全排列及相关扩展算法(二)——求字典序下一组排列及全排列算法
- 数组全排列算法(一)字符串数组全排列——逐个追加组合算法
- 数组全排列算法(二)整型数组全排列——递归算法
- 全排列及相关扩展算法(五)——递增(递减)进位制数求原排列算法
- 全排列生成算法之一——字典排序算法
- 排列的算法(一)——字典序算法
- 全排列的算法(七)——递归算法
- 01算法笔记——【递归】排列问题,整数划分问题,Hanoi问题
- Joda
- CRM WEB UI EXCEL DOWNLOAD ERROR
- 解决不能执行已释放的js脚本问题
- 2-focus开发平台
- Ubuntu 更改密码的方法
- 算法——排列篇01
- build
- tsock使用
- apache tomcat
- C#动态执行字符串
- 显卡类型: 集成显卡 独立显卡 核芯显卡有什么区别
- java面试中经常会被问到的一些算法的问题
- cocoa应用程序生命周期
- 【Android】 Activity Lifecycle