3、插入排序(详细)

目录
Sort类在选择排序中的约定中

正文

每次都将当前元素插入到左侧已经排序的数组中,使得插入之后左侧数组依然有序。
插入排序的时间复杂度取决于数组的初始顺序,如果数组已经部分有序了,那么逆序较少,需要的交换次数也就较少,时间复杂度较低。

public class Insertion<T extends Comparable<T>> extends Sort<T>{

	@Override
	public void sort(T[] nums) {
		int Len = nums.length;//数组长度
		for(int i = 1; i < Len ; i ++) {//遍历数组,i要从1开始
										//因为我们要判断下标为j-1和j的大小
			for(int j = i; j > 0 && less(nums[j], nums[j - 1]);j --){//保证左侧的值有序
				swap(nums, j, j - 1);//逆序则交换
			}
		}
	}

}

复杂度

最好的情况下需要 N-1 次比较和 0 次交换,最好的情况就是数组已经有序了
最坏的情况下需要 ~N2/2 比较以及 ~N2/2 次交换,最坏的情况是数组是倒序的;
时间复杂度:平均O(n²)
最好O(n) 顺序
最坏O(n²) 逆序
空间复杂度:O(1)
稳定性:稳定

PS:我刚开始看实现的时候在想,没有插入啊,为啥叫插入语句啊,细想之后明白了,我们可以吧左侧已经排好序的部分看做一个数组,后面来一个就相当于是插入一个。
小知识

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值