zoukankan      html  css  js  c++  java
  • 剑指offer-面试题14.调整数组顺序使奇数位于偶数的前面

    题目:输入一个整数数组,实现一个函数来调整该数组中的数字的顺序,

    使得所有的奇数位于数组的前半部门,所有的偶数位于数组的后半部门。

    这一题一看其实是很简单的,当然在不考虑效率的情况可以这样考虑

    我们将数组从前开始索引只要发现偶数这将偶数取出来并且将偶数后

    面的元素全部前移一个然后将偶数插入到最后,这样扫描一遍之后

    就将偶数全部放在了后半部门,奇数放在了前半部分。但是效率不好

    每次遇到偶数都要移动偶数后面的所有元素再加上遍历数组的时间

    则达到了O(n2)

    我们可以用两个索引或者指针,一个指向数组的末尾一个指向数组的开始。

    1.前面的索引向后移动直到遇到偶数,后面的索引向前索引直到遇到奇数

    2.交换两个元素

    3.重复步骤1,2知道后面的的索引与前面的索引相遇或者在前面的索引之前则结束。

    实现代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void RecorderOddEven(int *pData,int length)
     5 {
     6     int p1,p2;
     7     p1=0;
     8     p2=length-1;
     9 
    10     while(p2>p1)
    11     {
    12         while(p2>p1&&pData[p1]%2!=0)
    13             p1++;
    14         while(p2>p1&&pData[p2]%2==0)
    15             p2--;
    16 
    17         int temp;
    18         temp=pData[p1];
    19         pData[p1]=pData[p2];
    20         pData[p2]=temp;
    21     }
    22 }
    23 
    24 int main(int argc, char* argv[])
    25 {
    26     int nums[5]={1,2,3,4,5};
    27     int length=5;
    28     RecorderOddEven(nums,length);
    29     for(int i=0;i<length;i++)
    30     {
    31         cout<<nums[i]<<",";
    32     }
    33     cout<<endl;
    34     return 0;
    35 }

    运行截图:

  • 相关阅读:
    linux三剑客之sed
    线程与循环的区别?
    Notify和NotifyAll的区别?
    no system images installed for this target这个问题如何解决?
    Intent里ACTION的CALL和DIAL的区别?
    onConfigurationChanged方法的使用
    String和StringBuffer的区别?
    Activity的状态保存
    C#将datatable数据转换成JSON数据的方法
    SQL语句:关于复制表结构和内容到另一张表中的SQL语句
  • 原文地址:https://www.cnblogs.com/vpoet/p/4671742.html
Copyright © 2011-2022 走看看