一 题目:调整数组顺序使奇数位于偶数前面

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

二 解题思路

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

  这里可以参考快速排序的思想,快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的

    

三 代码实现

  1. void Swap(int *p, int *q)
  2. {
  3. int temp = *p;
  4. *p = *q;
  5. *q = temp;
  6. }
  7.  
  8. void ResetArray(int a[], int nLen)
  9. {
      if (NULL == a || nLen <= 0)
        {
            return;
        }
  10. int *left = a;
  11. int *right = &a[nLen -];
  12. while (left < right)
  13. {
  14. while(*left % && (left < right))
  15. {
  16. left ++;
  17. }
  18. while ((*right % ) == && (left < right))
  19. {
  20. right --;
  21. }
  22.  
  23. Swap(left++, right--);
  24. }
  25. }
  26.  
  27. void main()
  28. {
  29. int a[] = {,,,,,,,,};
  30. ResetArray(a, );
  31.  
  32. return;
  33. }

四 可扩展实现

  如果把题目改成把数组中的数分为两部分,能被3整除的数都在不能被3整除的数的前面。面对需求的变化,我们发现代码变化的部分很小,因此从可扩展性的角度考虑,我们可以改写上面的代码如下,这里利用回调函数来实现。

  1. typedef bool (*Proc)(int *);
  2. bool CmpCondition_1(int *p)
  3. {
  4. if (*p % )
  5. {
  6. return true;
  7. }
  8.  
  9. return false;
  10. }
  11.  
  12. bool CmpCondition_2(int *p)
  13. {
  14. if (*p % )
  15. {
  16. return false;
  17. }
  18.  
  19. return true;
  20. }
  21.  
  22. void ResetArray(int a[], int nLen, Proc fun)
  23. {
  24. if (NULL == a || nLen <= || NULL == fun)
  25. {
  26. return;
  27. }
  28. int *left = a;
  29. int *right = &a[nLen -];
  30. while (left < right)
  31. {
  32. while(fun(left) && (left < right))
  33. {
  34. left ++;
  35. }
  36. while (!fun(right)&& (left < right))
  37. {
  38. right --;
  39. }
  40.  
  41. Swap(left++, right--);
  42. }
  43. }
  44.  
  45. void PrintArry(int *a, int nLen)
  46. {
  47. for (int i = ;i < nLen; i ++)
  48. {
  49. cout << a[i] << " ";
  50. }
  51.  
  52. cout << endl;
  53. }
  54.  
  55. void main()
  56. {
  57. int a[] = {,,,,,,,,};
  58. cout <<"原始数组:";
  59. PrintArry(a, );
  60. ResetArray(a, ,CmpCondition_1);
  61. cout <<"奇数放前面,偶数方面:";
  62. PrintArry(a, );
  63. ResetArray(a, ,CmpCondition_2);
  64. cout <<"被3整除的放前面:";
  65. PrintArry(a, );
  66. return;
  67. }

剑指Offer面试题:11.调整数组顺序使奇数位于偶数前面的更多相关文章

  1. C++版 - 剑指offer面试题14: 调整数组顺序使奇数位于偶数前面

    题目: 调整数组顺序使奇数位于偶数前面 热度指数:11843 时间限制:1秒 空间限制:32768K 本题知识点: 数组 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇 ...

  2. 剑指Offer:面试题14——调整数组顺序使奇数位于偶数前面(java实现)

    问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路: 1.最简单的想法,不考虑时间复杂度,扫描数组,遇到偶数,先取出这 ...

  3. 剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面

    剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面2013-11-30 02:17 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部 ...

  4. 剑指offer(13)调整数组顺序使奇数位于偶数前面

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

  5. 【剑指Offer】13、调整数组顺序使奇数位于偶数前面

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

  6. 【剑指offer】Q14:调整数组顺序使奇数位于偶数前面

    def isOdd(n): return n & 1 def Reorder(data, cf = isOdd): odd = 0 even = len( data ) - 1 while T ...

  7. 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面

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

  8. 剑指offer面试题14-调整数组顺序使奇数位于偶数前面

    题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 前后分的这个.,让我想起来高速排序.好吧,就用这个做. 考虑到了排序的可扩 ...

  9. 【剑指offer】面试题 21. 调整数组顺序使奇数位于偶数前面

    面试题 21. 调整数组顺序使奇数位于偶数前面

随机推荐

  1. 对Java的接口和抽象类 的一些了解

    学习并转载自: https://mp.weixin.qq.com/s?__biz=MzAxMzQ3NzQ3Nw==&mid=2654251476&idx=4&sn=e66ec4 ...

  2. 【Head First Servlets and JSP】笔记21:从有脚本到无脚本

    可以建立多态的bean引用吗 使用type,但没有class scope属性默认为“page” 从有脚本到无脚本 1.快速搭建一个测试环境:输入用户名,返回“Hello, 用户名” index.htm ...

  3. Linux常用命令--文件(夹)查找之find命令

    Linux系统用得越久,就会发现这真的是一个很优秀的系统,各种方便各种实用各种高效率. 晚饭前写一下find命令的笔记. 其实这篇笔记,也是看到一篇外文博客,写得不错,自己拿来练一练,然后才顺便写篇笔 ...

  4. [Android Studio系列(五)] Android Studio手动配置Gradle的方法

    1 问题 (1) android sutdio第一次打开一个工程巨慢怎么办? (2) 手动配置Gradle Home为什么总是无效? (3) 明明已经下载了Gradle,配置了gradle home, ...

  5. Convolutional Neural Network

    Why CNN for Image 图片是由像素点组成的,可以这样来解释深度神经网络对图片的处理. 第一层的layer是最基本的分类器,区分一些基本的特征,比如颜色.是否有斜线. 第二层的layer会 ...

  6. 深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE

    概念和区别 SELECT ... LOCK IN SHARE MODE走的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他session可以读取这些记录,也可以继续添加IS ...

  7. Memcached set 命令

    Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中. 如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用. 语法: s ...

  8. scala学习手记24 - 多参数函数值

    上一节的函数值只有一个参数.函数值当然也是可以有多个参数的.看一下下面的inject方法: def inject(arr: Array[Int], initial: Int, operation: ( ...

  9. 一块网卡多个IP实现

    ////////////////////////////写在前面//////////////////////////////////////////// 需要注意,这里我们是一块网卡多个IP,而并非是 ...

  10. js进阶---12-12、jquery事件委托怎么使用

    js进阶---12-12.jquery事件委托怎么使用 一.总结 一句话总结:通过on方法(事件委托),给要绑定事件的元素的祖先绑定事件,从而达到效果. 1.事件委托是什么? 通过事件冒泡,让子元素绑 ...