题目 输入任意数字组成的数组,将该数组前半部分全部变成偶数,后半部分变成奇数输出

1. Code

说应用,代码多少是要改的,用思想!

import java.util.*;
public class Test{
    // 交换类:冒泡/快速
    // 插入类:直接插入/折半插入/希尔排序
    // 选择类:直接选择/堆排序
    // 其他:基数排序/二分归并
    // 稳定:冒泡/直接插入/希尔排序/二分归并/基数排序
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        List<Integer> list = new ArrayList<Integer>();
        int temp=in.nextInt();
        while(temp!=-1){
            list.add(temp);
            temp=in.nextInt();
        }
        int[] arr = new int[list.size()];
        for(int i=0; i<list.size(); i++)
            arr[i]=list.get(i);
        BubbleSort(arr);
        System.out.println();
        InsertSort(arr);
        System.out.println();
        SpaceSort(arr);
       in.close();
    }
  • 冒泡排序
    public static void BubbleSort(int[] arr){
        for(int i=0; i<arr.length;i++){
            for(int j=0; j<arr.length-1-i;j++){
                int temp=0;
                // 前偶后奇就交换
                if(arr[j] %2==0 && arr[j+1] %2==1){
                    temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j]= temp; 
                }
            }
        }
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");            
        }
    }
  • 直接插入排序
    public static void InsertSort(int[] arr){
        int nextOddIndex=0;
        int possibleOddIndex=0;
        for(int i=0;i<arr.length;i++){
            if(arr[i]%2==1){
                nextOddIndex = i;
                while(nextOddIndex > possibleOddIndex){
                    int temp = arr[nextOddIndex];
                    arr[nextOddIndex] = arr[nextOddIndex-1];
                    arr[nextOddIndex-1] = temp;
                    nextOddIndex--;
                }
                possibleOddIndex++;
            }
        }
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");            
        }
    } 
  • 以空间换时间(新建一个数组)
    public static void SpaceSort(int[] arr){
        int oddBegin=0,oddEnd=0;
        for(int i=0;i<arr.length;i++){
            if(arr[i]%2==0)
                oddEnd++;
        }
        int[] sorted = new int[arr.length];
        for(int i=0;i<arr.length;i++){
            if(arr[i] %2== 1){
                sorted[oddBegin] =arr[i];
                oddBegin++;
            }else{
                sorted[oddEnd] = arr[i];
                oddEnd++;
            }
        }
        arr = sorted;
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");            
        }
    }
}
/**
 * Main method to demonstrate the rearrangeArray functionality.
 */
public static void main(String[] args) {
    int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
    rearrangeArray(arr);
    System.out.println(Arrays.toString(arr));
}
 
/**
 * Rearranges the array so that the first half contains only even numbers and the second half contains only odd numbers.
 *
 * @param arr The input array to be rearranged.
 */
public static void rearrangeArray(int[] arr) {
    int middleIndex = arr.length / 2;
    int leftIndex = 0;
    int rightIndex = middleIndex;
 
    while (leftIndex < middleIndex && rightIndex < arr.length) {
        leftIndex = processLeftHalf(arr, leftIndex, middleIndex, rightIndex);
        middleIndex = processRightHalf(arr, leftIndex, middleIndex);
        rightIndex++;
    }
}
 
/**
 * Processes the left half of the array to ensure it contains only even numbers.
 *
 * @param arr         The input array to be processed.
 * @param leftIndex   The current index in the left half of the array.
 * @param middleIndex The middle index of the array.
 * @param rightIndex  The current index in the right half of the array.
 * @return The updated left index.
 */
public static int processLeftHalf(int[] arr, int leftIndex, int middleIndex, int rightIndex) {
    if (arr[leftIndex] % 2 == 0) {
        return leftIndex + 1;
    } else {
        int evenIndex = findNextEven(arr, rightIndex);
        if (evenIndex != -1) {
            swap(arr, leftIndex, evenIndex);
            return leftIndex + 1;
        }
    }
    return leftIndex;
}
 
/**
 * Processes the right half of the array to ensure it contains only odd numbers.
 *
 * @param arr         The input array to be processed.
 * @param leftIndex   The current index in the left half of the array.
 * @param middleIndex The middle index of the array.
 * @return The updated middle index.
 */
public static int processRightHalf(int[] arr, int leftIndex, int middleIndex) {
    if (arr[middleIndex] % 2 == 1) {
        return middleIndex + 1;
    } else {
        int oddIndex = findNextOdd(arr, leftIndex);
        if (oddIndex != -1) {
            swap(arr, middleIndex, oddIndex);
            return middleIndex + 1;
        }
    }
    return middleIndex;
}
 
/**
 * Finds the index of the next even number in the array starting from the specified index.
 *
 * @param arr        The input array.
 * @param startIndex The starting index for the search.
 * @return The index of the next even number, or -1 if not found.
 */
public static int findNextEven(int[] arr, int startIndex) {
    for (int i = startIndex; i < arr.length; i++) {
        if (arr[i] % 2 == 0) {
            return i;
        }
    }
    return -1;
}
 
/**
 * Finds the index of the next odd number in the array starting from the specified index.
 *
 * @param arr        The input array.
 * @param startIndex The starting index for the search.
 * @return The index of the next odd number, or -1 if not found.
 */
public static int findNextOdd(int[] arr, int startIndex) {
    for (int i = startIndex; i < arr.length; i++) {
        if (arr[i] % 2 == 1) {
            return i;
        }
    }
    return -1;
}
 
/**
 * Swaps the elements at the specified indices in the array.
 *
 * @param arr The input array.
 * @param i   The first index.
 * @param j   The second index.
 */
public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}