給一個數組,把偶數放到左邊,奇數放到右邊(有序和無序)

思路:設置兩個指針,一個less一個more,如果當前less位置的元素爲偶數,那麼和more位置的元素交換位置,more--,接着繼續判斷交換過來的元素是否是偶數,如果繼續是偶數,那麼繼續和more位置的元素交換,一直循環到less>=more,複雜度爲O(N)代碼如下

    public static void reOrderArray(int[] arr) {
        if (arr.length == 0 || arr == null) return;
        int less = 0;
        int more = arr.length - 1;
        while ( less < more ) {
                while ( arr[less] % 2 == 0 ) {//只要當前less位置的元素爲偶數
                    swap(arr, less, more);//交換位置
                    more--;//交換後more位置肯定爲偶數了,那麼more--,繼續循環判斷交換的元素是否是偶數
                }
            less++;
        }
    }
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

完整代碼:給一個數組,把偶數放到左邊,奇數放到右邊

下邊看進階版:

題目描述

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

思路,只要前面的數爲偶數,當前的數爲奇數,那麼就一直交換位置到最前面的奇數後面,這個指針爲less,時間複雜度爲O(N),不過一直從後往前交換,交換次數較多,但是這種方法沒有使用額外空間。

貼上代碼:

public static void reOrderArray(int [] array) {
        if ( array == null || array.length == 0 ) return;
        int left = 0;//從左向右最右邊的奇數下標
        for (int i = 0; i < array.length; i++) {
            if (array[i] % 2 == 1) {
                int cur = i;//碰到的奇數
                while ( cur > left ) {//逐個交換已經排序了的最右邊的奇數下標到當前奇數之間的所有數
                    swap(array, cur, --cur);
                }
                left++;//交換完奇數下標向右移動
            }
        }
    }
    private static void swap(int[] array, int j, int i) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }

完整代碼:調整數組順序使奇數位於偶數前面(有序)

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