【基础排序】之插入排序

算法评价

  • 时间复杂度:平方阶

  • 空间复杂度:常量阶

  • 稳定性:稳定

  • 适用数据规模量:小规模
    注:若数据本身就有部分是有序的,那么插入排序比冒泡排序更高效。

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

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

就像我们玩斗地主一样,上手一副牌,我们先要对其进行排序。

第一步:左边第二张牌Y和左边第一张牌X比较。若Y<X,那么将X挪到第二张的位置,将Y挪到第一张的位置。

第二步:(假设第一步结束后前两张排的顺序为XY)左边第三张牌Z和左边第二张牌Y比较,若Z<Y,那么将Y挪
               到第三张的位置;然后Z再与左边第一张牌X比较,若Z>=X(即:X<=Z<Y),那么将Z挪到第二张牌的位
               置,此时,当前牌Z的位置y已经确定下来了(为第二张),那么第二张牌前面的牌不动。

……

第n-1步:第n张牌和前面的排好序的牌进行比较,(假设前面的排好序的牌中,小或等于第n张牌的众多牌里,
                最大的牌为α;大于第n张牌的众多牌里,最小的牌为β),那么第n张牌落在α牌与β牌之间。

算法演示图

Java对插入排序的实现(工具类)

import java.util.Collections;
import java.util.List;

/**
 * 插入排序的Java实现
 *
 * @author JustryDeng
 * @date 2019/4/29 9:54
 */
public class Insertion {

    /**
     * 插入排序的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 currentValue;
        // 从第二个数开始往前面比较
        for (int i = 1; i < size; i++) {
            currentValue = list.get(i);
            int j = i - 1;
            while (j >= 0 && currentValue.compareTo(list.get(j)) < 0) {
                list.set(j + 1, list.get(j));
                j--;
            }
            list.set(j + 1, currentValue);
        }
        // 升序/降序
        if (!asc) {
            Collections.reverse(list);
        }
        return list;
    }
}

测试一下

控制台输出:

由此可见,插入排序工具类编写成功

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

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

猜你喜欢

转载自blog.csdn.net/justry_deng/article/details/89674458
今日推荐