插入排序 Insertion Sort

插入排序:流程描述

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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值