标签:
此类实现:
输出一行数组数据,根据输入的下标,以下标位置为结束,将原数组分割成两组子数组。
并交换两个子数组的位置,保持子数组中的元素序号不变.
如:原数组为7,9,8,5,3,2 以下标3为分割点,分割为子数组一:7,9,8,5。和子数组二:3,2.
经过交换算法后的结果应为:3,2,7,9,8,5
有两种交换算法
<1>前插法:将子数组3,2另存在一个临时数组中,将原数组7,9,8,5,3,2每一位向后移两个位置
再将子数组3,2插入到移动好元素位置的原数组中。
<2>逆置法:将原数组7,9,8,5,3,2逆置为2,3,5,8,9,7
再分别逆置分割好的两个子数组,结果应为:3,2,7,9,8,5
package 顺序表; import java.util.ArrayList; import java.util.Scanner; /** * @param args * @author 刘雁冰 * @date 2015-2-2 19:43 */ /* * 此类实现: * 输出一行数组数据,根据输入的下标,以下标位置为结束,将原数组分割成两组子数组。 * 并交换两个子数组的位置,保持子数组中的元素序号不变. * 如:原数组为7,9,8,5,3,2 以下标3为分割点,分割为子数组一:7,9,8,5。和子数组二:3,2. * 经过交换算法后的结果应为:3,2,7,9,8,5 * * 有两种交换算法 * <1>前插法:将子数组3,2另存在一个临时数组中,将原数组7,9,8,5,3,2每一位向后移两个位置 * <2>逆置法:将原数组7,9,8,5,3,2逆置为2,3,5,8,9,7 * 再分别逆置分割好的两个子数组,结果应为:3,2,7,9,8,5 */ public class ResetOrderListPostion { /* * int []order:数组存储用户输入的原数组 * int postion:存储用户输入的分隔下标 */ static int []order; static int postion; /* * 前插法 */ public void frontInsert(int []orderInsert,int postion){ /* * 使用ArrayList链表来存储分隔后的子数组一 */ ArrayList<Integer> listA=new ArrayList<Integer>(); for(int i=postion+1;i<orderInsert.length;i++){ listA.add(orderInsert[i]); } int a[]=new int[listA.size()]; for(int i=0;i<listA.size();i++){ a[i]=listA.get(i); //将原数组每一个元素往后移动子数组长度次 for(int j=orderInsert.length-1;j>0;j--){ orderInsert[j]=orderInsert[j-1]; } } //将子数组一插入到移动好的子数组中 for(int k=a.length-1;k>=0;k--){ orderInsert[k]=a[k]; } //注意消除最后一个元素的,号 System.out.println("使用前插法---交换位置后数组的结果如下:"); for(int j=0;j<orderInsert.length;j++){ if(j==orderInsert.length-1) System.out.print(orderInsert[j]); else System.out.print(orderInsert[j]+","); } } /* * 逆置法 */ public void inversion(int []orderInversion,int postion){ //逆置整个原数组 for(int i=0;i<orderInversion.length/2;i++){ int t=orderInversion[i]; orderInversion[i]=orderInversion[orderInversion.length-1-i]; orderInversion[orderInversion.length-1-i]=t; } //逆置子数组一 for(int i=0;i<(orderInversion.length-postion)/2;i++){ int t=orderInversion[i]; orderInversion[i]=orderInversion[orderInversion.length-postion-2-i]; orderInversion[orderInversion.length-postion-2-i]=t; } //逆置子数组二 for(int i=0;i<(postion+1)/2;i++){ int t=orderInversion[orderInversion.length-1-i]; orderInversion[orderInversion.length-1-i]=orderInversion[orderInversion.length-postion-1+i]; orderInversion[orderInversion.length-postion-1+i]=t; } //注意消除最后一个元素的,号 System.out.println("使用逆置法---交换位置后的结果如下:"); for(int i=0;i<orderInversion.length;i++){ if(i==orderInversion.length-1) System.out.print(orderInversion[i]); else System.out.print(orderInversion[i]+","); } System.out.println(); } public static void main(String[] args) { // TODO Auto-generated method stub ResetOrderListPostion rp=new ResetOrderListPostion(); System.out.println("请输入数组,按-1结束输入"); ArrayList<Integer>list=new ArrayList<Integer>(); Scanner sc=new Scanner(System.in); int m=sc.nextInt(); while(m!=-1){ list.add(m); m=sc.nextInt(); } int []order=new int[list.size()]; for(int i=0;i<list.size();i++){ order[i]=list.get(i); } System.out.println("您输入的数组数据为:"); for(int i=0;i<order.length;i++){ if(i==order.length-1) System.out.print(order[i]); else System.out.print(order[i]+","); } System.out.println(); System.out.println("请输入下标,以此来将原数组分隔成两个数组(注意,输入的下标不能小于0且不能大于等于数组长度):"); int postion=sc.nextInt(); System.out.println("您输入的分割下标为:\n"+postion); //判定输入的分隔下标有效性 if(postion<0||postion>=order.length) System.out.println("输入有误!"); else{ System.out.println("********************请选择数组位置交换算法********************"); System.out.println("********************1--:前插法********************"); System.out.println("********************2--:逆置法********************"); int n=sc.nextInt(); switch(n){ case 1:{ rp.frontInsert(order, postion); break; } case 2:{ rp.inversion(order, postion); break; } default: System.out.println("输入有误!"); } } } }
java实现原数组根据下标分隔成两个子数组并且在原数组中交换两个子数组的位置
标签:
原文地址:http://www.cnblogs.com/luckid/p/4268700.html