`
从此醉
  • 浏览: 1044772 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

调整数组顺序使奇数位于偶数前面[算法]

 
阅读更多

题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。

分析:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于碰到一个偶数,需要移动O(n)个数字,因此总的时间复杂度是O(n)。

要求的是把奇数放在数组的前半部分,偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面。也就是说我们在扫描这个数组的时候,如果发现有偶数出现在奇数的前面,我们可以交换他们的顺序,交换之后就符合要求了。

因此我们可以维护两个指针,第一个指针初始化为数组的第一个数字,它只向后移动;第二个指针初始化为数组的最后一个数字,它只向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针指向的数字是偶数而第二个指针指向的数字是奇数,我们就交换这两个数字。

基于这个思路,我们可以写出如下的代码:

 

void Reorder(int *pData, unsigned int length, bool (*func)(int));
bool isEven(int n);

/////////////////////////////////////////////////////////////////////////
// Devide an array of integers into two parts, odd in the first part,
// and even in the second part
// Input: pData  - an array of integers
//        length - the length of array
/////////////////////////////////////////////////////////////////////////
void ReorderOddEven(int *pData, unsigned int length)
{
      if(pData == NULL || length == 0)
            return;

      Reorder(pData, length, isEven);
}

/////////////////////////////////////////////////////////////////////////
// Devide an array of integers into two parts, the intergers which 
// satisfy func in the first part, otherwise in the second part
// Input: pData  - an array of integers
//        length - the length of array
//        func   - a function
/////////////////////////////////////////////////////////////////////////
void Reorder(int *pData, unsigned int length, bool (*func)(int))
{
      if(pData == NULL || length == 0)
            return;

      int *pBegin = pData;
      int *pEnd = pData + length - 1;

      while(pBegin < pEnd)
      {
            // if *pBegin does not satisfy func, move forward
            if(!func(*pBegin))
            {
                  pBegin ++;
                  continue;
            }

            // if *pEnd does not satisfy func, move backward
            if(func(*pEnd))
            {
                  pEnd --;
                  continue;
            }

            // if *pBegin satisfy func while *pEnd does not,
            // swap these integers
            int temp = *pBegin;
            *pBegin = *pEnd;
            *pEnd = temp;
      }
}

/////////////////////////////////////////////////////////////////////////
// Determine whether an integer is even or not
// Input: an integer
// otherwise return false
/////////////////////////////////////////////////////////////////////////
bool isEven(int n)
{
      return (n & 1) == 0;
}

 转自:www.acmerblog.com

分享到:
评论

相关推荐

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

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

    Python《剑指offer》算法实现-调整数组顺序使奇数位于偶数前面

    1. 初级程序员注重算法和数据结构 2. 事先做好准备,对工作有热情 3. 面试过程放松。不要急于写代码,了解清楚所要解决的问题,多和面试官沟通,然后开始做一些整体的设计和规划。不要急于提交,自己测试几个用例避免错误...

    Java算法实现调整数组顺序使奇数位于偶数之前的讲解

    今天小编就为大家分享一篇关于Java算法实现调整数组顺序使奇数位于偶数之前的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    剑指Offer(Python多种思路实现):调整数组的顺序使奇数位于偶数前面

    剑指Offer(Python多种思路实现):调整数组的顺序使奇数位于偶数前面 面试21题: 题目:调整数组的顺序使奇数位于偶数前面 题一:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前...

    leetcode数组下标大于间距-my-algorithm:我的算法

    调整数组顺序使奇数位于偶数前面 数组中出现次数超过一半的数字 最小的k个数 数组中的第K个最大元素 把数组排成最小的数 存在重复元素 打乱数组 三数之和 化栈为队 144.二叉树的前序遍历 146.LRU缓存机制 155.最小栈...

    leetcode和剑指-Algorithm:剑指算法,leetcode,acm....等等,请访问并提供您的建议

    13.调整数组顺序使奇数位于偶数前面 14.单链表:链表中倒数第k个结点 15.单链表:反转链表 16.单链表:合并两个排序的链表 17.二叉树:树的子结构 18.二叉树:二叉树的镜像 19.顺时针打印矩阵 20.栈:包含min函数的栈

    javalruleetcode-play-leetcode:用程序解决leetcode的算法问题

    调整数组顺序使奇数位于偶数前面 面试题22 链表中倒数第k个节点 面试题24 反转链表 面试题25 合并两个排序的链表 面试题26 树的子结构 面试题27 二叉树的镜像 面试题28 对称的二叉树 面试题29 顺时针打印矩阵 面试题...

    丢失的最小正整数leetcode-Java_DataStructure:Java的数据结构和算法的学习

    13、调整数组顺序使奇数位于偶数前面 14、链表倒数第k个节点 15、反转链表 16、合并两个排序列表 17、树的子结构 18、二叉树的镜像 19、顺时针打印矩阵 20、包含min函数的栈 21、栈的压入、弹出序列 22、从上到下...

    在其他数都出现偶数次的数组中找到出现奇数次的数

    文章目录在其他数都出现偶数次的数组中找到出现奇数次的数整型数组中其他数都出现偶数次找到唯一出现奇数次的数题目算法思路相应代码整型数组中其他数都出现偶数次找到两个出现奇数次的数题目算法思路相应代码 ...

    javalruleetcode-Leetcode:LeetCode、Swordoffer、数据结构、算法的编程题

    调整数组顺序使奇数位于偶数前面 so.19.顺时针打印矩阵 so.28.数组中出现次数超过一半的数字 so.32.把数组排成最小的数 so.35.数组中的逆序对 so.40.数组中只出现一次的数字 so.41.和为S的连续正数序列 so.42.和为S...

    leetcode二维数组-programming_exercises:leetcode、nowcoder刷题之路

    调整数组顺序,使奇数位于偶数前面: 链表中倒数第k个节点: 反转链表: 合并两个排序的链表 树的子结构 二叉树的镜像 顺时针打印矩阵 包含main函数的栈 栈的压入、弹出序列 从上往下打印二叉树 二叉搜索树的后序遍历...

    构建大顶堆leetcode-LeetCode:ヾ(◍°∇°◍)ノ゙小黄的LeetCode刷题之路

    整数组顺序使奇数位于偶数前面 把数组排成最小的数 和为 S 的连续正整数序列 和为 S 的两个数字 N 数之和 三数之和 二维数组 构建乘积数组 顺时针打印矩阵 数据统计 数组中出现次数超过数组长度一半的数字 第一个只...

    python 实现在无序数组中找到中位数方法

    1、求一个无序数组的中位数, (若数组是偶数,则中位数是指中间两个数字之和除以2,若数组是奇数,则中位数是指最中间位置。要求:不能使用排序,时间复杂度尽量低 2、例如: lists = [3, 2, 1, 4] , 中位数为 = ...

    《数据结构 1800题》

    ①以下是该函数的程序段,请将未完成的部分填入,使之完整 int f(m,n) int m,n; { if(m==1) return (1) ; if(n==1){ return (2) ;} if(m) {return f(m,m);} if (m==n) {return 1+ (3) ;} return f(m.n-1)...

    DES数据加密

    比如,我们可以对所有的偶数位置的数据使用a表,对所有的奇数位置使用b表,即使黑客获得了明文和密文,他想破译这个加密方案也是非常困难的,除非黑客确切的知道用了两张表。 与使用“置换表”相类似,“变换...

    leetcode提交记录怎么看-LeetCode:刷题

    然后将小于mid的数放在数组的偶数位置(0,2,4……),将大于mid的数放在数组的奇数位置(1,3,5……) 有序矩阵中第K小的元素(自己做的,有待优化) 题目: 给定一个 n x n 矩阵,其中每行和每列元素均按升序...

    javascript入门笔记

    使用场合:任意数字与1做按位与操作,可以判断奇偶性,结果为1,则为奇数,否则为偶数 0 :0 1 :1 2 :10 3 :11 4 :100 5 :101 5 & 1 101 001 ========== 001 4 & 1 100 001 ==== 000 2、按...

    上海电机学院C语言实训答案

    实训是在学生已经具备了使用C语言编写简单的应用程序的能力,为使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,通过提出算法、指定输入输出来设计一个解决方案。并为参加计算机等级考试...

    世界500强面试题.pdf

    1.6.3. 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数 位于数组的后半部分 ...........................................................130 1.6.4. 给定链表的头指针和一个...

    达内 coreJava 习题答案

    1,编写程序,判断给定的某个年份是否是闰年。 闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年。 (2)若某个年份能被400整除,则也是闰年。 import java.util.Scanner;...

Global site tag (gtag.js) - Google Analytics