调整数组顺序使奇数位于偶数前面

问题

调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

算法

这本质就是一道排序算法

  • 可以采用空间换时间算法,利用两个数组分别存放奇数和偶数,然后再合并奇偶数组即可;但是这种算法复杂度较大
   //这种方式:太过于复杂
    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));
        }

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