插入排序 Insertion Sort

来源:互联网 发布:淘宝打包员招聘 编辑:程序博客网 时间:2024/05/17 06:17

插入排序:流程描述

  1. 从第一个元素开始,该元素可以认为已经被排序。
  2. 选中下一个元素,从已经排好序的元素中从后向前扫描。
  3. 如果该元素(已排序的)大于选中元素,则将该元素移动到它后面的位置。
  4. 重复3步骤,直到找到已排序的元素小于等于选中元素。
  5. 将选中元素插入4步骤元素的后面。
  6. 重复2-5步骤。
插入排序:简单例子
  1. 3 7 9 6 8 0 2 5 1
  2. 3 7 9 6 8 0 2 5 1
  3. 3 7 9 6 8 0 2 5 1
  4. 3 6 7 9 8 0 2 5 1
  5. 3 6 7 8 9 0 2 5 1
  6. 0 3 6 7 8 9 2 5 1
  7. 0 2 3 6 7 8 9 5 1
  8. 0 2 3 5 6 7 8 9 1
  9. 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;}

插入排序:小结
        插入排序算法确实很简单,但是要正确实现,还是要费点心思的。说着容易做着难,是因为说的时候,没有说出全部内容。希望大家指正。




原创粉丝点击