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

核心考点:数组操作,排序思想的扩展使用

题目描述

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

链接

https://www.nowcoder.com/practice/beb5aa231adc45b2a5dcc5b62c93f593?tpId=13&tqId=11166&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

解题思路

之前我们做过类似的题目,所得是可以改变奇数和偶数的顺序,这样的话我们就可以使用两个指针,分别指向头和尾,进行比较在交换就可以,但是这里区别是需要保证奇偶位置不变的。

现在新增了需求,解决方法也比较多,我们用较优方式解决一下,借鉴一下插入排序的思想

算法实现

package java_20200728;

/**
 * @ Created with IntelliJ IDEA.
 * @ClassName Test2
 * @Description
 * @Author by小房
 * @Date 2020/7/28 23:29
 */
public class Test2 {
    public void reOrderArray(int [] array) {
        int k = 0; // 在这里采用插入排序的思想,k 在这里控制奇数的个数也就是下标,第一个奇数插在 0 号下标,那么第二个奇数就插在1号下标
        for (int i = 0; i < array.length; i++) {
            if ((array[i] & 1) == 1) { //利用位运算判断奇数还是偶数
                int tmp = array[i]; //临时存一下奇数,后边将奇数放在k 位置
                int j = i;
                // 将找到的奇数平移到 k下标
                ////将该奇数之前的内容(偶数序列),整体后移一个位置
                while (j > k) {
                    array[j] = array[j-1];
                    j--;
                }
                // 把 tmp 放在 k 下标
                array[k] = tmp;
                k++; //k 相当于奇数个数-1
            }

        }

    }
}

你可能感兴趣的:(算法)