题目描述

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

一、方法一

一、分析

使用冒泡排序算法的思想

二、代码

  1. class Solution {
  2. public:
  3. void reOrderArray(vector<int> &array) {
  4. for(int i=0;i<array.size();i++)
  5. {
  6. for(int j=array.size()-1;j>0;j--)
  7. {
  8. if(array[j]%2==1&&array[j-1]%2==0)
  9. {
  10. swap(array[j],array[j-1]);
  11. }
  12. }
  13. }
  14. }
  15. };

二、方法二

一、分析

思路:参考快速排序,使用两个指针来遍历数组

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

    二、代码

  1. int i = 0;
  2. while(i<array.length)
  3. {
  4. int j = i+1;
  5. if(array[i]%2==0)
  6. {
  7. while(array[j]%2==0)
  8. {
  9. if(j==array.length-1)
  10. {
  11. return;
  12. }
  13. j++;
  14. }
  15. int n = j-i;
  16. int temp = array[i];
  17. array[i] = array[j];
  18. array[i+1] = temp;
  19. while(n>1)
  20. {
  21. array[i+n] = array[i+n-1];
  22. n--;
  23. }
  24. array[i+1] = temp;
  25. }
  26. i++;
  27. }

三、方法三

采用插入排序算法,和方法二类似

  1. public class Solution {
  2. public void reOrderArray(int [] array) {
  3. //相对位置不变,稳定性
  4. //插入排序的思想
  5. int m = array.length;
  6. int k = 0;//记录已经摆好位置的奇数的个数
  7. for (int i = 0; i < m; i++) {
  8. if (array[i] % 2 == 1) {
  9. int j = i;
  10. while (j > k) {//j >= k+1
  11. int tmp = array[j];
  12. array[j] = array[j-1];
  13. array[j-1] = tmp;
  14. j--;
  15. }
  16. k++;
  17. }
  18. }
  19. }
  20. }