调整数组顺序使奇数位于偶数前面(代码的完整性)

来源:互联网 发布:js导出excel兼容ie 编辑:程序博客网 时间:2024/06/06 03:04

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


思路一:新建一个数组,依次存入奇数,最后将原来数组中的偶数存入奇数数组的后面

时间复杂度为O(n),空间复杂度为O(n)。

public class Solution {    public void reOrderArray(int [] array) {        int[] odd = new int[array.length];        int oddCount = 0;        for (int i = 0; i < array.length; i++)        {            if (array[i] % 2 == 1)            {                odd[oddCount] = array[i];                array[i] = 0;                oddCount++;            }        }        for (int i = 0; i < array.length; i++)        {            if (array[i] != 0)            {                odd[oddCount] = array[i];                oddCount++;            }        }        for (int i = 0; i < array.length; i++)            array[i] = odd[i];    }}


思路二:类似于插入排序

1.要想保证原有次序,只能顺次移动或相邻交换。

2.i从左向右遍历,找到第一个奇数temp。

3.j从i-1开始向左找,如果找到一个偶数,则将它向右移一位,直到找到前一个奇数或者回到数组开始的地方,将这个奇数temp插入。

时间复杂度为O(n^2),空间复杂度为O(1)。

public class Solution {    public void reOrderArray(int [] array) {        int temp = 0;        for (int i = 1; i < array.length; i++)        {            if (array[i] % 2 == 1)            {                temp = array[i];                int j = i - 1;                while (array[j] % 2 == 0)                {                    array[j + 1] = array[j];                    j--;                    if (j < 0) break;                }                array[++j] = temp;            }        }    }}


思路三:与思路二类似

1.要想保证原有次序,只能顺次移动或相邻交换。

2.i从左向右遍历,找到第一个偶数。

3.j从i+1开始向后找,直到找到第一个奇数。

4.将[i,...,j-1]的元素整体后移一位,最后将找到的奇数放入i位置,然后i++。

时间复杂度为O(n^2),空间复杂度为O(1)。

public class Solution {    public void reOrderArray(int [] array) {        int temp = 0;        for (int i = 0; i < array.length; i++)        {           if (array[i] % 2 == 0)           {               for (int j = i + 1; j < array.length; j++)               {                   if (array[j] % 2 == 1)                   {                       temp = array[j];                       int m = j - 1;                       for (; m >= i; m--)                           array[m + 1] = array[m];                       array[++m] = temp;                       break;                   }               }           }        }    }}




思路四:类似冒泡算法,前偶后奇数就交换。

时间复杂度为O(n^2),空间复杂度为O(1)。

public class Solution {    public void reOrderArray(int [] array) {        int temp = 0;        for (int i = 0; i < array.length; i++)        {            for (int j = array.length - 1; j > i; j--)            {                if (array[j - 1] % 2 == 0 && array[j] % 2 == 1)                {                    temp = array[j - 1];                    array[j - 1] = array[j];                    array[j] = temp;                }            }        }    }}




阅读全文
0 0
原创粉丝点击