调整数组顺序使奇数位于偶数前面
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
此题应该注意的是要求奇数与奇数,偶数与偶数之间的相对位置不变,则不能使用类似快排的思想,若不要求相对位置,只要求奇数在偶数前,则可以使用,代码如下:
public void reOrderArray(int [] array) { if(array.length == 0){ return; } int high = array.length - 1; int low = 0; while(low < high){ //从前向后找,找到第一个偶数 while(low < high && array[low] % 2 == 1){ low ++; } //从后向前找,找到第一个奇数 while(low < high && array[high] % 2 == 0){ high --; } //交换 int temp = array[low]; array[low] = array[high]; array[high] = temp; } }
算法思想:
(1)类似插入排序,当前数是奇数,就往前找,遇到偶数就往它前面插
public class Solution { public void reOrderArray(int [] array) { for(int i = 1; i < array.length;i++){ //当当前数为奇数时 if(array[i] % 2 == 1){ int t = i; //寻找该奇数前面的偶数,并与其交换,同时更新当前奇数的下标 for(int j = t; j > 0;j--){ if(array[j-1] % 2 == 0){ int temp = array[t]; array[t] = array[j-1]; array[j-1] = temp; t = j-1; } } } } } }
(2)借助栈
public void reOrderArray(int [] array) { Stack<Integer> stack = new Stack(); for(int i = 0; i < array.length; i++) { if(array[i] % 2 == 1) stack.push(array[i]); } for(int i = 0; i < array.length; i++) { if(array[i] % 2 == 0) stack.push(array[i]); } for(int i = array.length-1; i > 0;i--){ array[i] = stack.pop(); } }
扩展:在编程设计的时候,可以考虑将判断当前数是奇数还是偶数的方法提取出来,增强方法的通用性。