您的位置:首页 > 其它

不改变正负数之间相对顺序重新排列数组

2015-07-12 18:59 531 查看
import java.util.Random;

/**题目说明:
 * 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正
 *负数之间相对顺序。
 *比如: input: 1,7,-5,9,-12,15 ,ans: -5,-12,1,7,9,15 。且要求时间复杂度 O(N),
 *空间 O(1) 。
 * 
 * 本题时间复杂度为O(NlogN),空间 O(1) 
 * 
 * 
 * @author 牵手无奈
 *
 */
public class Main4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//int[] array = new int[]{1,-2,3,5,8,-56,-78,7,21,-43,75,-75};
		//int[] te = {1,2,3,4,5,6,7};
		//reverse(te, 0, te.length-1);
		int[] array=getRandomArray(20);
		merge(array, 0, array.length-1);
		for(int i=0;i<array.length;i++){
			System.out.print(array[i]+"  ");
		}

	}
	
	/**交换数据,使负数在前,正数在后,并使顺序保持原来的关系
	 * @param array	数组
	 * @param l
	 * @param m
	 * @param r
	 */
	public static void adjust(int[] array,int l,int m,int r){
		//因为归并的关系,从l到m,负数肯定在前面,从m+1到r,两样负数在前面,参考归并排序时,在这里小数在前,大数在后
		//假设从l到r的数字别是= -1 -2 4 5 6     -3 -1  6 8
		int i=l;
		int j=m;
		//找也左边组第一个为正数的下标,也就是4
		while(array[i]<0&&i<m){
			i++;
		};
		////找也右边组第一个为正数的下标,也就是6
		while(j<=r&&array[j]<0){
			j++;
		};
		
		//如果右边组合是正数,则不需要调整
		if(j==m){
		//把右边组的数调整为负数在后,正数在前
		if(j<=r){
		reverse(array, m, j-1);//-1  -3  6  8
		reverse(array, j, r);//-1  -3  8  6
		reverse(array, m, r);//6  8  -1  -3
		}
		
		int rr=r-j+m+1;
		if(i<rr){
		reverse(array, i,rr-1);//-1 -2 4 5 6  6  8  -1  -3 ==》-1 -2 8 6 6 5 4 -1 -3
		reverse(array, rr, r);// -1 -2 8 6 6  5  4  -1  -3 ==》 -1 -2 8 6 6  5  4  -3  -1
		reverse(array, i, r);//  -1 -2 8 6 6  5  4  -3  -1 ==》 -1 -2 -3 -2 8 6 6  5  4 

		}
		
	}
	}
	
	/**数组逆序
	 * @param array
	 * @param l
	 * @param r
	 */
	public static void reverse(int[] array,int l,int r){
		
		int i=l;
		int j=r;
		while(i<j){
			array[i]=array[i]^array[j];
			array[j]=array[i]^array[j];
			array[i]=array[i]^array[j];
			i++;j--;
		}
	}
	
	
	/**二分数组
	 * @param array
	 * @param l
	 * @param r
	 */
	public static void merge(int[] array,int l,int r){
		if(l>=r){
			return;
		}else{
			int m = (l+r)/2;
			merge(array, l, m);
			merge(array, m+1, r);
			adjust(array, l,m+1, r);
		}
	}
	
	/**产生随机数组
	 * @param size
	 * @return
	 */
	public static int[] getRandomArray(int size){
		Random rd = new Random();
		int[] array=new int[size];
		for(int i=0;i<size;i++){
			if(rd.nextBoolean()){
				array[i]=rd.nextInt(1000)+1;
			}else{
				array[i]=-rd.nextInt(1000)-1;
			}
			System.out.print(array[i]+"  ");
		}
		System.out.println("\n");
		return array;
	}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: