题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
插入排序O(N^2):
public class Solution {
public void reOrderArray(int [] array) {
if(array==null||array.length==0)
return ;
int j=0;
for(int i=0;i<array.length;i++){
if((array[i]&1)==1){
int k=i;
int temp=array[k];
while(k>j){
array[k]=array[k-1];
k--;
}
array[j]=temp;
j++;
}
}
}
}
新建数组法O(N):
import java.util.Arrays;
public class Solution {
public void reOrderArray(int [] array) {
if(array==null||array.length==0)
return ;
int [] newArray=new int[array.length];
int j=0;
for(int i=0;i<array.length;i++){
if((array[i]&1)==1){
newArray[j]=array[i];
j++;
}
}
for(int i=0;i<array.length;i++){
if((array[i]&1)==0){
newArray[j]=array[i];
j++;
}
}
for(int i=0;i<array.length;i++){
array[i]=newArray[i];
}
}
}
变种归并排序:
public class Solution {
public void reOrderArray(int [] array) {
if (array == null || array.length == 0)
return;
if ( array.length == 1)
return;
int[] temp = new int[array.length];
mergeSort(array, 0, array.length - 1, temp);
for(int i=0;i<array.length;i++){
array[i]=temp[i];
}
}
//两个数组归并
private static void mergeArray(int array[], int first, int mid, int last, int temp[]) {
int i = first, j = mid + 1; // i为第一组的起点, j为第二组的起点
int m = mid, n = last; // m为第一组的终点, n为第二组的终点
int k = 0; // k用于指向temp数组当前放到哪个位置
while(i <= m &&(array[i]&1)==1)// 先将第一组奇数填入
temp[k++] = array[i++];
while(j <= n &&(array[j]&1)==1)//再将第二组奇数填入
temp[k++] = array[j++];
while(i <= m &&(array[i]&1)==0)//再将第一组偶数填入
temp[k++] = array[i++];
while(j<= n &&(array[j]&1)==0)//再将第二组偶数填入
temp[k++] = array[j++];
for (i = 0; i < k; i++) {// 将排好序的数填回到array数组的对应位置
array[first + i] = temp[i];
}
}
// 归并
private static void mergeSort(int array[], int first, int last, int temp[]) {
if (first < last) {
int mid = (first + last) / 2;
mergeSort(array, first, mid, temp); // 递归归并左边元素
mergeSort(array, mid + 1, last, temp); // 递归归并右边元素
mergeArray(array, first, mid, last, temp); // 再将二个有序数列合并
}
}
}