天天看點

對一個整型數組做奇數在前偶數在後的順序調整

給你一個整型數組,做順序調整,要求:

1,奇數在前、偶數在後

2,效率高、節省記憶體

拿到這個題目的時候我首先想到的方法是:

1,對原數組做二等分,分别放入兩個數組a,b

2,循環a,b,把a的偶數與b的奇數交換位置

3,把兩個數組合到一起

可是這種方案新申請了2個數組,如果資料很大,這個記憶體開銷可想代價很大……

怎麼省記憶體呢,我是想不到了,然後百度了一下,發現了大俠的好方法,

主要是循環的合理應用,其實挺簡單的,實作如下:

public static void main(String[] args){
        int[] arr = new int[];
        Random random = new Random();
        for(int index =; index <arr.length ; index++){
            arr[index] = random.nextInt();
        }
        exchange(arr);
    }
    /**
     * 借用&運算,判斷奇偶數
     * @param arr
     */
    public static void exchange(int[] arr){
        long time1 = System.currentTimeMillis();
        if(null == arr || arr.length<= ){
            return;
        }
        int bef = ;
        int back = arr.length-;
        int temp ;
        while(bef < back){
            while( bef<back && (arr[bef]&) == ){//說明是奇數
                bef++;
            }
            while( bef<back && (arr[back]&) == ){//說明是偶數
                back--;
            }
            if( bef<back ){
                temp = arr[bef];
                arr[bef] = arr[back];
                arr[back] = temp;
            }
        }
        long time2 = System.currentTimeMillis();
        System.out.println(""+(time2-time1));
    }
           

首先大俠的辦法沒有新開辟空間,滿足了題目的2點要求。

然後判斷奇偶數首先想到的是n%2,大俠用的是&位運算,

我測試了一下,

如果是數組資料量小,兩者計算速度幾乎相同,如果資料量大了,&位運算速度就快一些了。

顯然這些小細節開發還是謹慎點好。

PS:

&運算規則:

兩個操作數中 位都為1,與運算結果為1;否則與運算結果為0;

操作數x & 1運算結果為1,逆推後,說明x的二進制末尾應是1,那麼x為奇數。

寫到這裡很開心,加油。