题目描述:
调整之后,不关心大小顺序。
如数组:[1,2,3,4,5,6]
调整后可能是:[1, 5, 3, 4, 2, 6]
解题思路:
·可以使用常用的双指针方法,利用“两头向中间调整”对数据进行排序。
·两个数据之间有三种情况
1.左指针是偶数右指针是奇数
使用冒泡排序类似的方法,交换数据(指针移动)
2.两个都是奇数
因为要保持奇数在偶数之前,所以当左指针代表数字是奇数时,左指针向右移动
3.两个都是偶数
因为要保持奇数在偶数之前,所以当右指针代表数字是偶数数时,左指针向左移动
当左指针小于右指针(下标)时停止大循环。
public class changeNum {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
rearrange(arr);
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void rearrange(int[] arr) {
int n = arr.length;
int left = 0, right = n - 1;
while (left < right) {
// 找到左边是偶数,右边是奇数时,交换
if (arr[left] % 2 == 0 && arr[right] % 2 != 0) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
// 移动左指针
if (arr[left] % 2 != 0) {
left++;
}
// 移动右指针
if (arr[right] % 2 == 0) {
right--;
}
}
}
}
进阶:还要考虑数字之间顺序
分成两部分数组,继续使用冒泡排序的方法(已经存在)sort(),最后把两段数组结合在一起。
import java.util.Arrays;
public class changeNum2 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6}; // 初始数组
rearrangeAndSort(arr); // 调整数组并排序
// 打印调整后的数组
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void rearrangeAndSort(int[] arr) {
int n = arr.length;
int left = 0, right = n - 1;
// 先进行奇数和偶数的分离,双指针法
while (left < right) {
// 如果arr[left]是偶数,arr[right]是奇数,交换
if (arr[left] % 2 == 0 && arr[right] % 2 != 0) {
// 交换
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
// 如果arr[left]是奇数,向右移动left
if (arr[left] % 2 != 0) {
left++;
}
// 如果arr[right]是偶数,向左移动right
if (arr[right] % 2 == 0) {
right--;
}
}
// 分别对奇数部分和偶数部分进行排序
// 奇数部分的排序
int[] oddArr = Arrays.copyOfRange(arr, 0, left);
Arrays.sort(oddArr);
// 偶数部分的排序
int[] evenArr = Arrays.copyOfRange(arr, left, n);
Arrays.sort(evenArr);
// 将排序后的奇数和偶数数组合并回原数组
System.arraycopy(oddArr, 0, arr, 0, oddArr.length);
System.arraycopy(evenArr, 0, arr, oddArr.length, evenArr.length);
}
}