1.题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
2.思路:
方法一:
新开数组空间换时间的解法,
a.从头遍历数组,如果是奇数从头部放入到新数组中,
b.从尾遍历数组,如果是偶数从尾部放入新数组
c.将新数组的元素复制到原数组
时间复杂度O(n^2)
public class Solution {
public void reOrderArray(int [] array) {
if(array.length==0) return;
int[] temp=new int[array.length];
int head=0;
int tail=array.length-1;
for(int i=0;i<array.length;i++){
if((array[i]&1)==1){//奇数
temp[head]=array[i];//放前面
head++;
}
if((array[array.length-1-i]&1)==0){//偶数
temp[tail]=array[array.length-1-i];//放后面
tail--;
}
}
for(int j=0;j<temp.length;j++){
array[j]=temp[j];//复制给原数组
}
}
}方法二:本题应该是为了考察排序算法
由于要求相对位置不变,则考虑稳定的排序算法:冒泡排序、插入排序、归并排序
冒泡排序:
public class Solution {
public void reOrderArray(int [] array) {
if(array.length==0) return;
boolean flag=true;//优化
int temp=0;
for(int i=0;i<array.length&&flag;i++){
flag=false;
for(int j=0;j<array.length-i-1;j++){
if((array[j]&1)==0&&(array[j+1]&1)==1){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
flag=true;
}
}
}
}
}
插入排序:
public class Solution {
public void reOrderArray(int [] array) {
//相对位置不变,稳定性
//插入排序的思想
int m = array.length;
int k = 0;//记录已经摆好位置的奇数的个数
for (int i = 0; i < m; i++) {
if (array[i] % 2 == 1) {
int j = i;
while (j > k) {//j >= k+1
int tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
j--;
}
k++;
}
}
}
}
京公网安备 11010502036488号