图解【剑指Offer T21】调整数组顺序使奇数位于偶数前面

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

http://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593

思路:参考快速排序

  • i++往前走碰到偶数停下来,j = i+1
  • a[j]为偶数,j++前进,直到碰到奇数
    • a[j]对应的奇数插到a[i]位置,j经过的j-i个偶数依次后移
  • 如果j==len-1时还没碰到奇数,证明ij之间都为偶数了,完成整个移动

图片说明

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int len = array.size();
        if(len <= 1){ // 数组空或长度为1
            return;
        }

        int i = 0;
        while(i < len){
            int j = i + 1;
            if(array[i]%2 == 0){ // a[i]为偶数,j前进,直到替换
                while(array[j]%2 == 0){ // j为偶数,前进
                    if(j==len-1)// i为偶数,j也为偶数,一直后移到了末尾,证明后面都是偶数
                         return;
                    j++;
                }
                // 此时j为奇数
                int count = j-i;
                int temp = array[i];
                array[i] = array[j];
                while(count>1){
                    array[i+count] = array[i+count-1];//数组后移
                    count--;
                }
                array[i+1] = temp;
            }
            i++;
        }
    }
};
全部评论
每次碰到奇数都把偶数全体右移一位,最差时间复杂度O(n2),空间复杂度依然是O(n)。 这样做在常数上节省了空间,但是在时间上却有很大恶化,相对于传统做法的时间和空间双O(n)意义不大。
8 回复
分享
发布于 2019-08-28 11:12
你好 这个代码 当输入数组为[0,2]时,j执行完两次加1 j=2了 数组越界了吧 应该把j++ 放到 if的后面吧 先判断 再前进
4 回复
分享
发布于 2019-08-25 15:51
联易融
校招火热招聘中
官网直投
这不是插入排序?怎么成了快排了?
3 回复
分享
发布于 2019-10-20 14:53
快排不能保证稳定性,代码应该是插排。其实冒泡也可以
1 回复
分享
发布于 2020-01-13 09:50
假如我用两个数组把它存起来,遍历一边O(n)我就能存好了。再来一轮O(n)把数组接起来,才是O(2n)。
1 回复
分享
发布于 2020-04-06 22:05
这是用什么画的图?
点赞 回复
分享
发布于 2019-09-01 01:10
思路是快排的思路,但是实际操作却是插入,每次插入奇数移动了相当数量的偶数,而快排本身只是交换,这里开销比快排大多了。
点赞 回复
分享
发布于 2019-12-24 15:35
时间超时的
点赞 回复
分享
发布于 2020-01-16 12:41
其实思路也不算是快排,应该是冒泡或者插入排序。不过这种方法也挺好的,毕竟原生能做到n^2也可以了。
点赞 回复
分享
发布于 2020-02-27 22:23
感觉是冒泡排序,最好时间复杂度是O(n),最坏是O(n^2),平均应该也是O(n^2)
点赞 回复
分享
发布于 2020-03-03 10:23
时间复杂度有点高
点赞 回复
分享
发布于 2020-03-15 18:37
vector容器对中间元素移动不是很费时间吗
点赞 回复
分享
发布于 2020-06-25 09:22

相关推荐

点赞 评论 收藏
转发
点赞 评论 收藏
转发
53 3 评论
分享
牛客网
牛客企业服务