算法评价:
-
时间复杂度:平方阶。
-
空间复杂度:常量阶。
-
稳定性:不稳定。
-
适用数据规模量:小规模。
算法复杂度与数据规模量关系图:
算法原理简述(举例说明):
总共n个学生无序随机选择座位(座位有序号1、2、3……n),现在需要根据学生学习成绩好坏来分配座位(规则是:成绩越好,座位号越靠前),分配开始:
第一步:给座位1分一个学生,从所有学生中选择成绩最好的来坐。
第二步:给座位2分一个学生,从剩下的学生中选择成绩最好的来坐。
……
第n-1步:给座位n-1分一个学生,从剩下的两个学生中选择成绩最好的来坐座位n-1,剩下的那个学生分给座位n。
算法演示图:
Java对选择排序的实现(工具类):
import java.util.Collections;
import java.util.List;
/**
* 选择排序的Java实现
*
* @author JustryDeng
* @date 2019/4/30 10:20
*/
public class Selection {
/**
* 选择排序的java实现
*
* 提示: 泛型Integer可换为任何一个 实现了Comparable接口的类
*
* 注: 这里没考虑元素本身为null的问题
*
* @param list
* 要被排序的对象集合
* @param asc
* 升序/降序。 true-升序; false-降序
*
* @return 排序后的集合(P.S : 其实就算不返回任何值 , 调用sort方法后 , 原list中的元素位置也会被排序)
* @date 2019/4/29 9:55
*/
public static List sort(List<Integer> list, boolean asc) {
if (list == null || list.size() <= 1) {
return list;
}
int size = list.size();
Integer tmp;
// 用于记录每轮比较时,最小值所在位置的索引
int minValueIndex;
for (int i = 0; i < size - 1; i++) {
minValueIndex = i;
for (int j = i; j < size - 1; j++) {
if (list.get(j + 1).compareTo(list.get(minValueIndex)) < 0) {
minValueIndex = j + 1;
}
}
// 互换
if (minValueIndex != i) {
tmp = list.get(minValueIndex);
list.set(minValueIndex, list.get(i));
list.set(i, tmp);
}
}
// 升序/降序
if (!asc) {
Collections.reverse(list);
}
return list;
}
}
测试一下:
控制台输出:
由此可见,选择排序工具类编写成功!