調整數組順序使奇數位於偶數前面

問題

調整數組順序使奇數位於偶數前面
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

算法

這本質就是一道排序算法

  • 可以採用空間換時間算法,利用兩個數組分別存放奇數和偶數,然後再合併奇偶數組即可;但是這種算法複雜度較大
   //這種方式:太過於複雜
    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));
        }

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章