java实现原数组根据下标分隔成两个子数组并且在原数组中交换两个子数组的位置...

此类实现:
输出一行数组数据,根据输入的下标,以下标位置为结束,将原数组分割成两组子数组。
并交换两个子数组的位置,保持子数组中的元素序号不变.
如:原数组为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("输入有误!");
				}
		}
	}

}

  

 

转载于:https://www.cnblogs.com/luckid/p/4268700.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值