思想:每轮遍历寻找最值(MAX,MIN),筛选出后,剩余元素重复进行
第一轮遍历前
第一轮遍历中
第一轮遍历后
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;
}
}