问题
调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
算法
这本质就是一道排序算法
- 可以采用空间换时间算法,利用两个数组分别存放奇数和偶数,然后再合并奇偶数组即可;但是这种算法复杂度较大
//这种方式:太过于复杂
public void reOrderArray(int [] array) {
ArrayList<Integer> aArray = new ArrayList<>();
ArrayList<Integer> bArray = new ArrayList<>();
for(int i=0;i<array.length;i++){
if(array[i]%2==0){//偶树
bArray.add(array[i]);
}else{
aArray.add(array[i]);
}
}
for(int i=0;i<aArray.size();i++){
array[i]=aArray.get(i);
System.out.println(array[i]);
}
for(int i=aArray.size();i<array.length;i++){
array[i]=bArray.get(i-aArray.size());
}
}
可以采用
插入排序的算法
- 遍历数组,每次找到它应该插入到的位置
- 若当前元素为欧元素,则不用动
- 若当前元素为奇元素,则需要和之前已经
按照奇偶顺序排好的数组
进行比较
- 若在其前面存在偶元素,则需要将其插入到第一个欧元素之前
- 若之前没有偶元素,则什么也不做
/**
* 从题目信息得出:
* 相对位置不变-----》保持稳定性
* 奇数位于前面,偶数位于后面
* 存在判断,挪动元素位置
* 这些都和内部排序算法相似,考虑到具有稳定性的排序算法不多,例如插入排序,归并排序等;
* @param array
*/
public void reOrderArray1(int [] array){
for(int i=0;i<array.length;i++){
int insertValue = array[i];
//若为偶数,则不用到,若为奇数则需要到其前面找看是否需要和偶数交换
if(insertValue%2!=0){
for(int j=0;j<i;j++){
//在此次带插入值的前面找到了一个偶数,则插入到该偶数前面
if(array[j]%2==0){
for(int t=i;t>j;t--){
array[t]=array[t-1];
}
array[j]=insertValue;
break;
}
}
}
}
}
可以采用
冒泡排序
学会类比
- 在
数字排序
中采用冒泡,需要排序n轮,每轮需要在还没有排序的元素中产生最大值,将其不断向后移动- 在
奇偶排序
中采用冒泡,需要n轮(其实并不需要n轮,在这种情况下)
·这种情况下就有可能需要遍历n次
//冒泡排序
public void reOrderArray3(int [] array){
for(int i=0;i<array.length;i++){
for(int j=0;j<array.length-i-1;j++){
if(array[j]%2==0&&array[j+1]%2!=0){
int temp = array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
System.out.println(Arrays.toString(array));
}
}