美文网首页剑指Offer题解
调整数组顺序使得奇数位于偶数前面

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

作者: lvlvforever | 来源:发表于2018-07-18 11:20 被阅读12次

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。

    第一种

    使用O(n)的额外空间,遍历两次。

     public void reOrderArray(int [] array) {
            if(array == null || array.length < 2){
                 return;
             }
             int[] backup = Arrays.copyOf(array,array.length);
             int j = 0;
             for(int i = 0;i < array.length; i++) {
                 if(backup[i] % 2 == 1){
                     array[j++] = backup[i];
                 }
             }
            for(int i = 0;i < array.length; i++) {
                if(backup[i] % 2 == 0){
                    array[j++] = backup[i];
                }
            }
        }
    
    第二种

    可以使用快速排序的思想,使用两个指针,分别指向数组头尾,移动头尾指针,当头指针遇到一个偶数,停下,当尾指针遇到一个奇数,停下,双方互换,直到两指针相遇。

     public void reOrderArray(int [] array) {
            if (array == null || array.length < 1) {
                return;
            }
            int i = 0;
            int j = array.length - 1;
            while (i < j) {
                while(!isEven(array[i]) && i <= array.length-1){
                    i++;
                }
                while (isEven(array[j]) && j >= 0) {
                    j--;
                }
                if(i < j){
                    swap(array, i, j);
                }else{
                    break;
                }
            }
            System.err.println(Arrays.toString(array));
        }
    
        private void swap(int[] arr, int i, int j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
        /**
         * 判断是否是偶数
         * @param num
         * @return
         */
        private boolean isEven(int num) {
            return (num & 1) == 0;
        }
    

    牛客网上的对应的题目:

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

    增加了相对位置不变的要求。上面的第一种方法依然适用。还可以使用稳定的排序算法-插入算法的思想。

    插入算法

    发现奇数就与前面的偶数调换。

     public void reOrderArray(int [] array) {
            if (array == null || array.length < 1) {
                return;
            }
            for (int i = 1; i < array.length; i++) {
                for (int j = i; j > 0 ; j--) {
                    if (!isEven(array[j]) && isEven(array[j-1])) {
                        swap(array, j, j-1);
                    }
                }
            }
            System.err.println(Arrays.toString(array));
        }
    
        private void swap(int[] arr, int i, int j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
        /**
         * 判断是否是偶数
         * @param num
         * @return
         */
        private boolean isEven(int num) {
            return (num & 1) == 0;
        }
    

    相关文章

      网友评论

        本文标题:调整数组顺序使得奇数位于偶数前面

        本文链接:https://www.haomeiwen.com/subject/fyqopftx.html