一、题目链接
http://noi.openjudge.cn/ch0110/06/
二、解题思路
三、实施步骤
四、Java程序
import java.util.Arrays;
import java.util.Scanner;
public class Main {
/**
* 将给定数组排成奇数在前、偶数在后的顺序
*
* @param nums int类型的数组,代表给定数组
*/
public void arrange(int[] nums) {
int left = 0; // 左游标
int right = nums.length - 1; // 右游标
/* 在左游标小于右游标时 */
while (left < right) {
/* 左游标往右移动,定位到当前遇到的第一个偶数 */
while (left < right && nums[left] % 2 != 0) {
left++;
}
/* 右游标往左移动,定位到当前遇到的第一个奇数 */
while (left < right && nums[right] % 2 == 0) {
right--;
}
if (left < right) { // 如果此时左游标小于右游标
int t = nums[left]; // 交换两个游标指向的元素
nums[left] = nums[right];
nums[right] = t;
}
}
}
/**
* 将给定数组中给定区间内的元素排成升序
*
* @param nums int类型的数组,代表给定数组
* @param from int类型的整数,代表给定区间的起始边界
* @param to int类型的整数,代表给定区间的终止边界
*/
public void sortASC(int[] nums, int from, int to) {
Arrays.sort(nums, from, to + 1);
}
/**
* 将给定数组中给定区间内的元素排成降序
*
* @param nums int类型的数组,代表给定数组
* @param from int类型的整数,代表给定区间的起始边界
* @param to int类型的整数,代表给定区间的终止边界
*/
public void sortDESC(int[] nums, int from, int to) {
Arrays.sort(nums, from, to + 1);
/* 对升序区间进行镜像反转,形成降序区间 */
for (int i = from, j = to; i < j; i++, j--) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
/**
* 将给定数组排成奇数在前、偶数在后,其中奇数为降序、偶数为升序
*
* @param nums int类型的数组,代表给定数组
*/
public void sort(int[] nums) {
arrange(nums); // 将nums数组排成奇数在前、偶数在后
int from = 0;
int to = 0;
int n = nums.length;
/* 找到nums数组中第一个偶数的位置 */
while (to < n && nums[to] % 2 != 0) {
to++;
}
to--; // 此时to代表nums数组中最后一个奇数的位置
sortDESC(nums, from, to); // 将nums数组中的奇数排成降序
sortASC(nums, to + 1, n - 1); // 将nums数组中的偶数排成升序
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
int n = 10;
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = input.nextInt();
}
test.sort(nums);
for (int e : nums) {
System.out.print(e + " ");
}
}
}