SelectionSort

思想:每轮遍历寻找最值(MAX,MIN),筛选出后,剩余元素重复进行
第一轮遍历前


SelectionSort_第1张图片
SelectionSort1.png

第一轮遍历中


SelectionSort_第2张图片
SelectionSort2.png

第一轮遍历后
SelectionSort_第3张图片
SelectionSort3.png

Java展现其思想

package sortingAlgo;

import java.util.Arrays;
import java.util.Random;

/**
 * @author 水皮蛋 
 *  特性:In-place sort,unstable sort。
 *  思想:每次遍历找一个最小值。 
 *  最好情况时间:O(n^2)。
 *  最坏情况时间:O(n^2)。
 */
public class SelectionSort {
    
    public static void main(String[] args) {
        int[] arr = createRandomArray();
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(selectionSort(arr)));
    }

    /**
     * @param arr
     *            需要排序的数组
     * @return 升序数组
     */
    public static int[] selectionSort(int[] arr) {
        if (arr == null)
            throw new NullPointerException();
        int n = arr.length, min, i;
        // 替换值变量
        int temp;
        for (i = 0; i < n; i++) {
            min = getMinKey(arr, i);
            if (min != i) {
                temp = arr[i];
                arr[i] = arr[min];
                arr[min] = temp;
            }
        }
        return arr;
    }

    /**
     * @param arr
     *            需要排序的数组
     * @return 数组元素最小的一个key
     */
    public static int getMinKey(int[] arr, int min) {
        // 防呆:防止对象为空,造成NPE
        if (arr == null)
            throw new NullPointerException();
        int n = arr.length;
        // 数组的长度如果小于2,排序没有意义
        if (!(n > 1))
            return 0;
        // 两两比较获取最小值得角标,即key
        for (int i = min + 1; i < n; i++) {
            if (arr[min] > arr[i])
                min = i;
        }
        return min;
    }

    /**
     * 使用Random类产生随机数组的对象
     * @return 随机数组
     */
    public static int[] createRandomArray() {
        Random random = new Random();
        int[] array = new int[10];
        for (int i = 0; i < 10; i++) {
            array[i] = random.nextInt(100);
        }
        return array;
    }
}

你可能感兴趣的:(SelectionSort)