原理:在数组中,选出区间[i,n)的最小值,然后与i位置的值进行比较,如果i的值比最小值还小,那么久交换他们的位置。
动画演示:
代码演示:数组长度为100000,数组范围[10,10000],源代码如下:
package com.loveyou.sort;
/**
* @author Lemon Sun
* @time 2018年8月12日 下午12:10:57
* @version 1.0
*/
public class SortSelection extends SortBase {
private static String CLASS_NAME_SELECTION = "com.loveyou.sort.SortSelection";
@SuppressWarnings({"unchecked", "rawtypes"})
public static void sort(Comparable[] arr) {
int length = arr.length;
if (length<1) {
log.warn("数组中没有元素.");
return ;
}
// 选择排序
for(int i = 0;i<length;i++) {
// 区间[i,n)最小值的index,初始化为i
int minIndex = i;
for(int j = i;j<length-1;j++) {
if(arr[j].compareTo(arr[minIndex])<0) {
minIndex = j;
}
}
SortBase.swap(arr, i, minIndex);
}
}
public static void main(String[] args) {
try {
Integer[] arr = SortBase.genRandomArr(100000, 10, 10000);
SortBase.testSort(CLASS_NAME_SELECTION, "sort", arr);
}
catch (Exception e) {
log.error(e.getMessage(),e);
}
}
}
17:38:45.861 [main] INFO com.loveyou.sort.SortBase - already sorted.
运行时间:12287 ms
可以看见,对于10万个数进行排序,运行时间大概耗费了12秒多。虽然比冒泡排序好许多,但依然不乐观,我们实际开发当中也几乎不会用到选择排序。