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;
}
}
不改变正负数之间相对顺序重新排列数组
最新推荐文章于 2022-07-28 15:44:50 发布