题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
这道题考察的排序。
这题这一看,分成两部本,太开心了,原来是快排的变种,于是写了程序,后来结果大家知道了,肯定不满足相对位置不变这个条件。因为快排本身就是不稳定的算法,稳定高效的排序算法常用的只有归并了,堆排也是不稳定的。所以,用归并排序的思想解决较合适。时间复杂度低。代码如下:
这题这一看,分成两部本,太开心了,原来是快排的变种,于是写了程序,后来结果大家知道了,肯定不满足相对位置不变这个条件。因为快排本身就是不稳定的算法,稳定高效的排序算法常用的只有归并了,堆排也是不稳定的。所以,用归并排序的思想解决较合适。时间复杂度低。代码如下:
public class Solution {
public void reOrderArray(int [] array) {
/*这样的相对位置会改变
测试用例:
[1,2,3,4,5,6,7]
对应输出应该为:
[1,3,5,7,2,4,6]
你的输出为:
[1,7,3,5,4,6,2]
//边界条件判断
if(array==null||array.length<2){
return;
}
//从左向右记录偶数的位置
int start=0;
//从右向左记录奇数的位置
int end=array.length-1;
//开始调整奇数和偶数的位置
while(start<end){
//找偶数的位置
while(start<end && array[start]%2!=0){
start++;
}
//找奇数的位置
while(start<end && array[end]%2==0){
end--;
}
// 找到后就将奇数和偶数交换位置
// 对于start=end的情况,交换不会产生什么影响
// 所以将if判断省去了
int tmp=array[start];
array[start]=array[end];
array[end]=tmp;
}这样的相对位置会改变*/
//用用归并排序的思想,因为归并排序是稳定的
int length = array.length;
if(length == 0){
return;
}
int[] des = new int[length];
MergeMethod(array, des, 0,length - 1);
}
public void MergeMethod(int[] array, int [] des, int start, int end){
if(start < end){
int mid = (start + end) / 2;
MergeMethod(array, des, start, mid);
MergeMethod(array, des, mid + 1, end);
Merge(array, des, start, mid, end);
}
}
public void Merge(int[] array, int[] des, int start, int mid, int end){
int i = start;
int j = mid + 1;
int k = start;
while(i <= mid && array[i] % 2 == 1){
des[k++] = array[i++];
}
while(j <= end && array[j] % 2 == 1){
des[k++] = array[j++];
}
while(i <= mid){
des[k++] = array[i++];
}
while(j <= end){
des[k++] = array[j++];
}
for(int m = start; m <= end; m++){
array[m] = des[m];
}
}
}