选择排序

选择排序

与冒泡类似,时间复杂度也是相同,但其中关键点在于记住索引。

  • 场景0:现有数组([2,5,3,1,4]),求这个数组的从小到大排序后数组表现。
  • 解决思路:依次确保第n个位置所在元素是前n个元素中最大的即可。
    • 2 < 5, 最大值为5,索引值为1。
    • 5 > 3, 5 > 1, 5 > 4。最大值还是5,索引值为1
    • 更换5 与 4的位置,此时数组为([2,4,3,1,5])
    • 继续比较,依次类推

目的是记住索引,记住最大或者最小值的索引,交换位置后。下一轮比较将直接跳过上一轮所更换的最大或者最小值位置。

Demo

package Sort;

import java.util.Arrays;

/**
 * 实现选择排序
 *
 * @author Ldity
 * @date: 2020/8/10 21点08分
 */
public class SelectSort {
    public static int[] arr = {123,34,132,21,23,1324,52,2123,23415,-1};

    /**
     * 获取两个值中的最小值的索引值
     *
     * @param arr - 待输入的数组
     * @param i 一个数的索引值i
     * @param j 一个属的索引值j
     * @return 返回最小值的索引
     */
    public static int minIndex(int[] arr, int i, int j){
        if( arr[i] < arr[j]){
            return i;
        }else return j;
    }

    /**
     * 交换数组中的两个值
     *
     * @param arr - 目的数组
     * @param i 其中一个数的索引值i
     * @param j 其中一个数的索引值j
     */
    public static void exchange(int[] arr, int i, int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

    /**
     * 实现选择排序
     *
     * @param arr - 待排序的数组
     */
    public static void selectSort(int[] arr){
        int n = arr.length;
        // 遍历i个元素
        for(int i = 0; i < n; i++){
            int min = i;
            //记录一次过程的最小值,然后返回
            for(int j = i + 1; j < n; j++){
                min = minIndex(arr, min, j);
            }
            exchange(arr, i, min);
        }
    }
    public static void main(String[] args){
        selectSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

原文地址:https://www.cnblogs.com/Di-iD/p/13785077.html