【基础排序】之选择排序

算法评价

  • 时间复杂度:平方阶

  • 空间复杂度:常量阶

  • 稳定性:不稳定

  • 适用数据规模量:小规模

算法复杂度与数据规模量关系图

算法原理简述(举例说明)

       总共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;
    }
}

测试一下

控制台输出:

 由此可见,选择排序工具类编写成功!  

^_^ 如有不当之处,欢迎指正

^_^ 本文已被收录进《程序员成长笔记(五)》,笔者JustryDeng

猜你喜欢

转载自blog.csdn.net/justry_deng/article/details/89706942