問題
調整數組順序使奇數位於偶數前面
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
算法
這本質就是一道排序算法
- 可以採用空間換時間算法,利用兩個數組分別存放奇數和偶數,然後再合併奇偶數組即可;但是這種算法複雜度較大
//這種方式:太過於複雜
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));
}
}