算法评价:
-
时间复杂度:平方阶。
-
空间复杂度:常量阶。
-
稳定性:稳定。
-
适用数据规模量:小规模。
注:若数据本身就有部分是有序的,那么插入排序比冒泡排序更高效。
算法复杂度与数据规模量关系图:
算法原理简述(举例说明):
就像我们玩斗地主一样,上手一副牌,我们先要对其进行排序。
第一步:左边第二张牌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;
}
}
测试一下:
控制台输出:
由此可见,插入排序工具类编写成功!