思路

  1. 反序
  2. 先以最左邊為基準點跟右邊依序做比較
  3. 把最大的放在最左邊
  4. 反覆執行迴圈

實作

測試方法

public static void main(String[] args) {
    int[] nums = new int[]{8, 2, 6, 10, 4};
    Sort_Selection3.selection_sort(nums);

    System.out.println();
}

具體

public static void selection_sort(int[] nums) { //8,2,6,10,4
    // 開始執行
    for (int i_start = 0; i_start < nums.length; i_start++) {
        int i_max = i_start; // 設定開始為最大,i_max=0
        // j_run = 設右邊為比較 開始迴圈
        // j_run + 1 -> 要跟右邊做比較確保右邊有值
        //i_max=0, 8,2,6,10,4
        //j_run=0+1=1,nums[1]=2>nums[0]=8,false
        //j_run=2,nums[2]=6>nums[0]=8,false
        //j_run=3,nums[3]=10>nums[0]=8,true,i_max=3
        //j_run=4,nums[4]=4>nums[3]=10,false

        //i_max=1, 10,2,6,8,4
        //j_run=2,nums[2]=6>nums[1]=2,i_max=2
        //j_run=3,nums[3]=8>nums[2]=6,i_max=3
        //j_run=4,nums[4]=4>nums[3]=8,false

        //i_max=2, 10,8,6,2,4
        //j_run=3,nums[3]=2>nums[2]=6,false
        //j_run=4,nums[4]=4>nums[2]=6,false

        //i_max=3, 10,8,6,2,4
        //j_run=4,nums[4]=4>nums[3]=2,i_max=4
        for (int j_run = i_start + 1; j_run < nums.length; j_run++) {
            // 如果右邊比左邊大
            if (nums[j_run] > nums[i_max]) {
                i_max = j_run; // 最大換成右邊
            }
        }

        //i_start=0,i_max=3,  10,2,6,8,4
        //i_start=1,i_max=3,  10,8,6,2,4
        //i_start=2,i_max=2,  10,8,6,2,4
        //i_start=3,i_max=4,  10,8,6,4,2
        swap(nums, i_start, i_max);
    }
}

private static void swap(int[] nums, int i_left, int i_right) {
    int tmp = nums[i_left]; //t=n[0]=8,t=n[1]=2,t=n[2]=6, t=n[3]=2
    nums[i_left] = nums[i_right];//n[0]=n[3]=10,n[1]=n[3]=8,n[2]=n[2]=6,n[3]=n[4]=4
    nums[i_right] = tmp;//n[3]=8,n[3]=2,n[2]=6,n[4]=2
}

實作 by recursion

測試方法

public static void main(String[] args) {
    nums = new int[]{8, 2, 6, 10, 4};
    Sort_Selection3.selection_sort_recursion(nums);

    System.out.println();
}

具體

public static void selection_sort_recursion(int[] nums) {
    int i_start = 0;
    selection_sort_recursion_help01(nums, i_start);
}

private static void selection_sort_recursion_help01(int[] nums, int i_start) {
    /** end condition **/
    if (i_start >= nums.length) {
        return;
    }

    /** main logic **/
    int i_max = i_start;
    int j_run = i_start + 1; // 要跟右邊做比較確保右邊有值

    // 將 i_max 收回來準備做 swap
    i_max = selection_sort_recursion_help02(nums, i_max, j_run);

    //i_start=0,i_max=3,  10,2,6,8,4
    //i_start=1,i_max=3,  10,8,6,2,4
    //i_start=2,i_max=2,  10,8,6,2,4
    //i_start=3,i_max=4,  10,8,6,4,2
    swap(nums, i_start, i_max);

    /** data flow **/
    selection_sort_recursion_help01(nums, i_start + 1);

}

private static int selection_sort_recursion_help02(int[] nums, int i_max, int j_run) {
    /** end condition **/
    if (j_run >= nums.length) {
        return i_max; // 執行完回傳 i_max
    }

    /** main logic **/
    if (nums[j_run] > nums[i_max]) {
        i_max = j_run;
    }

    /** data flow **/
    return selection_sort_recursion_help02(nums, i_max, j_run + 1);
}

private static void swap(int[] nums, int i_left, int i_right) {
    int tmp = nums[i_left]; //t=n[0]=8,t=n[1]=2,t=n[2]=6, t=n[3]=2
    nums[i_left] = nums[i_right];//n[0]=n[3]=10,n[1]=n[3]=8,n[2]=n[2]=6,n[3]=n[4]=4
    nums[i_right] = tmp;//n[3]=8,n[3]=2,n[2]=6,n[4]=2
}