插入排序:流程描述
- 从第一个元素开始,该元素可以认为已经被排序。
- 选中下一个元素,从已经排好序的元素中从后向前扫描。
- 如果该元素(已排序的)大于选中元素,则将该元素移动到它后面的位置。
- 重复3步骤,直到找到已排序的元素小于等于选中元素。
- 将选中元素插入4步骤元素的后面。
- 重复2-5步骤。
插入排序:简单例子
- 3 7 9 6 8 0 2 5 1
- 3 7 9 6 8 0 2 5 1
- 3 7 9 6 8 0 2 5 1
- 3 6 7 9 8 0 2 5 1
- 3 6 7 8 9 0 2 5 1
- 0 3 6 7 8 9 2 5 1
- 0 2 3 6 7 8 9 5 1
- 0 2 3 5 6 7 8 9 1
- 0 1 2 3 5 6 7 8 9
插入排序:是一种简单的排序算法。在数据量比较大时,它没有那些高级算法高效。比如堆排序、归并排序、快速排序。但是插入排序也有自身的有点:
- 简单。
- 高效(数据少时)。
- 自适应数据集也就是大幅排序后的数据集,时间复杂度为O(n+d),d是为排序的数据的个数。
- 比其它时间复杂度同为O(n²)的排序算法高效很多,比如选择排序和冒泡排序。
- 稳定。不改变相同键值的元素的顺序。
- 原地行。只需要大小为O(1)的额外内存空间来存储元素。
- 可以在接受的数据集上直接排序。
插入排序:最好、最坏、平均状况
- 最好情况是输入数据已经按要求排序。这时候的时间复杂度为O(n)。
- 最坏情况是输入数据已经排序,但不是按要求。即所谓的反序排列。这时候,它的时间复杂度为O(n²)。
- 平均状况时间复杂度也是n的二次方。
插入排序:代码(JAVA)
public List<T> sort(List<T> paras) {
if (null == paras) {
return null;
}
int size = paras.size();
if (1 >= size) {
return paras;
}
for (int index = 1; index < size; index++) {
T keyValue = paras.get(index);
int position = index - 1;
boolean isMove = false;
for (; position >= 0; position--) {
T positionValue = paras.get(position);
if (positionValue.compareTo(keyValue) > 0) {
paras.set(position + 1, positionValue);
isMove = true;
} else {
break;
}
}
if (isMove) {
paras.set(position + 1, keyValue);
}
}
return paras;
}
插入排序:小结
插入排序算法确实很简单,但是要正确实现,还是要费点心思的。说着容易做着难,是因为说的时候,没有说出全部内容。希望大家指正。