您的位置:首页 > Web前端

剑指Offer-->调整数组顺序使奇数位于偶数前面,并按顺序排列(2种方法)

2015-05-22 09:48 363 查看
从表面看好像这道题目很简单,其实做起来并没有想象中简单,个人觉得比较困难的点在于当奇数偶数已经分开但顺序没有排列的时候,对两半部分数组进行操作是稍微有些复杂的。提供了两种解法,希望大家能够有所借鉴。

import java.util.Arrays;

public class reOrderArray {

public void reOrderArrayDemo1(int[] array) {
int p1 = 0;
int p2 = array.length - 1;
int i ;
while (p1 < p2) {
if (array[p1] % 2 == 1 && p1 < p2) {  //p1的值不为偶数,向后移动
p1++;
}
if (array[p2] % 2 == 0 && p2 > p1) {  //p2的值不为奇数,向前移动
p2--;
}
//当指针p1所在位置的值是偶数且指针p2所在位置的值是奇数时,将两位置处的值进行倒换
if (array[p1] % 2 == 0 && array[p2] % 2 == 1) {
int temp = array[p1];
array[p1] = array[p2];
array[p2] = temp;
}
}
for (i = 0; i < array.length;i++) {
if(array[i] % 2 == 0){   //当数组元素为奇数时,使指针不断向后移动,直到遇到偶数停止,并将此时的位置记录
break;
}
}
reOrderArray.sort(array , 0 , i);
reOrderArray.sort(array , i , array.length);
}

public static void sort(int array[], int begin , int end) {  //对前面为奇数 后面为偶数的数组进行排序
for(int i = begin;i < end;i++){
int Min = i;
for(int j = i + 1;j < end;j++){
if(array[j] < array[Min]){
Min = j;
}
}
if(Min != i){
int temp = array[Min];
array[Min] = array[i];
array[i] = temp;
}
}
}

public void reOrderArrayDemo2(int[] array){
int[] copyOfArray = Arrays.copyOf(array , array.length);  //重新开辟一个数组,将原数组进行复制
Arrays.sort(copyOfArray);//我承认我无耻的直接调用了排序的方法 =。=||

int flag = 0; //对数组下标进行标记
/**
* 对copyOfArray数组进行遍历,遇到奇数进行取出,并放到array数组中,并使flag + 1
*/
for(int i = 0;i < copyOfArray.length;i++){
if(copyOfArray[i] % 2 == 1){
array[flag++] = copyOfArray[i];
}
}
/**
* 再次遍历,取出偶数,放到array数组中,同上
*/
for(int i = 0;i < copyOfArray.length;i++){
if(copyOfArray[i] % 2 == 0){
array[flag++] = copyOfArray[i];
}
}
}

public static void main(String args[]) {
reOrderArray r = new reOrderArray();
int[] array = {2 , 7 , 1 , 2 , 3 , 4 , 5 , 7 , 4};
r.reOrderArrayDemo1(array);
System.out.println();
for(int i = 0;i < array.length;i++){
System.out.print(array[i] + " ");
}
}

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