剑指offer---13---(排序,快排思想)---调整数组顺序使奇数位于偶数的前面

Posted buptyuhanwen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer---13---(排序,快排思想)---调整数组顺序使奇数位于偶数的前面相关的知识,希望对你有一定的参考价值。

 
 
题意
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。相对位置不改变。
 
分析
思路1:
因为偶数都要放到最后面去,所以出现一个偶数就放到最后,同时移动剩余的部分往前一位,这样能够保证相对位置不发生改变。O(n^2)
思路2:
先找到一个偶数,偶数要往后面放嘛,所以从偶数开始往后面找奇数,找到了就把奇数提前放在偶数的位置,因为找到的奇数是该偶数之后第一个奇数,所以奇数和偶数之间都是必须后移动一位的。
 
 
代码:
public class Solution {
    public void reOrderArray(int [] array) {
        if (array == null || array.length <= 1) return;
        
        int first = 0;
        int second = 0;
        //这边为什么使用while不用for,因为不是一步一步跳的,而是可以直接到末尾的。while用于不断后移动的操作。
        while (first < array.length) {
            while (first < array.length && isOdd(array[first])) {
                first ++;
            }
            if (first >= array.length - 1) {
                break;
            }
            second = first + 1;
            while (second < array.length && !isOdd(array[second])) {
                second ++;
            }
            if (second > array.length - 1) {
                break;
            }
            int temp = array[second];
            for (int i = second - 1; i >= first; i--) {
                array[i + 1] = array[i];
            }
            array[first] = temp;
        }
    }
    
    public boolean isOdd(int num) {
        return (num & 1) == 1;
    }
}

以上是关于剑指offer---13---(排序,快排思想)---调整数组顺序使奇数位于偶数的前面的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer(28)

[剑指Offer]快排

排序算法——快排思想

算法--排序--分治与快速排序

算法排序02——归并排序介绍及其在分治算法思想上与快排的区别(含归并代码)

LeetCode1738. 找出第 K 大的异或坐标值(快排堆排序)/ 剑指 Offer 48. 最长不含重复字符的子字符串 / 剑指 Offer 49. 丑数