不改变正负数之间相对顺序重新排列数组
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; } }
相关文章推荐
- 数组-11. 猴子选大王
- [黑马程序员]——java枚举
- 适配器杂谈之BaseAdapter
- git 学习笔记1-初识git
- Git官网文档
- Windows 10 10158预览版 Windows Hello脸部识别功能演示
- CommonJS是什么
- INFORMIX数据库下开发
- cocos2d-js(二)cocos2d-js的基本语法与类的简介
- java为什么配置环境变量
- [LeetCode][Java] Valid Sudoku
- github 如何删除已经存在的仓库
- cocos2d-js(二)cocos2d-js的基本语法与类的简介
- hbase regionserver节点连不上集群
- spark中的dataframe与sparksql的实例
- Python 获得Facebook用户有一个共同的兴趣Friends
- C语言中的strlen实现方法
- 重踏学习Java路上_Day26(网络编程)
- [LeetCode] Rectangle Area
- 增加 Java 有几个好习惯表现