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

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

http://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593

方式一

类似于冒泡排序法

public class Solution {
  public void reOrderArray(int[] array) {

    if (array == null || array.length < 2) {
      return;
    }

    // 交换标记
    boolean flag = false;
    int lastPos = 0;

    // end 是有序区指示
    for (int end = array.length; end >= 0; end--) {
      for (int i = 0; i < end - 1; i++) {
        if ( (!isOddNumber(array[i])) && isOddNumber(array[i + 1])) {
          swap(i, i + 1, array);
          flag = true;
          // 记录最后的有序区边界
          lastPos = i + 1;
        }
      }
      if (!flag) {
        break;
      }
      flag = false;
      // end-- 会将 end 减少一个
      end = lastPos + 1;
    }
  }

  public static void swap(int indexA, int indexB, int[] arr) {
    arr[indexA] = arr[indexA] ^ arr[indexB];
    arr[indexB] = arr[indexA] ^ arr[indexB];
    arr[indexA] = arr[indexA] ^ arr[indexB];
    return;
  }

  public static boolean isOddNumber(int val) {
    if (val % 2 == 1) {
      return true;
    }
    return false;
  }
}

方法二

类似归并排序,采用递归,待大佬优化

public class Solution {
  public void reOrderArray(int[] array) {

    if (array == null || array.length < 2) {
      return;
    }

    mergeOrder(array, 0, array.length - 1);
  }

  public static void mergeOrder(int[] arr, int L, int R) {
    if (L == R) {
      return;
    }
    int mid = L + ((R - L) >> 1);
    mergeOrder(arr, L, mid);
    mergeOrder(arr, mid + 1, R);
    mergePartitionArr(arr, L, mid, R);
  }

  public static void mergePartitionArr(int[] arr, int L, int mid, int R) {
    int[] helpArr = new int[R - L + 1];
    int pHelpArr = 0;
    int pLeftArr = L;
    int pRightArr = mid + 1;
    // 左边的奇数先放
    while (pLeftArr <= mid && isOddNumber(arr[pLeftArr])) {
      helpArr[pHelpArr++] = arr[pLeftArr++];
    }
    while (pRightArr <= R && isOddNumber(arr[pRightArr])) {
      helpArr[pHelpArr++] = arr[pRightArr++];
    }
    // 左边的偶数先放
    while (pLeftArr <= mid) {
      helpArr[pHelpArr++] = arr[pLeftArr++];
    }
    while (pRightArr <= R) {
      helpArr[pHelpArr++] = arr[pRightArr++];
    }
    for (int i = 0; i < helpArr.length; i++) {
      arr[L + i]  = helpArr[i];
    }
    return;
  }

  public static boolean isOddNumber(int val) {
    if (val % 2 == 1) {
      return true;
    }
    return false;
  }
}
全部评论

相关推荐

牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务