插入排序

  • 不同于冒泡排序和选择排序的时间复杂度和数据状况无关(因为每个数都要进行比对或者交换),插入排序的时间复杂度是和数据状况有关系的,这个先有一个概念,后面会详细介绍

下面我们来看代码:

public class InsertSort {

	public static void main(String[] args) {
		int[] arr = {0,3,6,2,4,9,8,7,1};
		insertSort(arr);
		for(int a : arr){
			System.out.print(a+" ");
		}
	}
	
	public static void insertSort(int[] arr){
		if(arr == null || arr.length < 2){
			return;
		}
		for(int i=1;i<arr.length;i++){//当前的数,要和之前有序区比对插入
			for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--){//j位置和j+1位置上的数进行比较相当于i-1和i上面的数进行比较
				swap(arr,j,j+1);
			}
		}
	}
	
	private static void swap(int[] arr,int i,int j){
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

}

这个代码还是外层循环控制起始位置也就是当前需要开始比较的位置,内存循环依靠边界和两侧数的大小来进行控制循环,每次条件成立,则进行交换,但是一旦一个条件不成立则跳出循环,内层循环直接结束。

为什么说插入排序的时间复杂度和数据状况有关系,来看下面:

现在有一组数据:0 1 2 3 4 5 6
根据插入排序规则,第二个数和第一个数相比(1和0),大于,跳出循环;第三个数和第二个数比较(2和1),大于,跳出循环…按照这样的方式,时间复杂度就是比较这一下,1+1+1+1+…=n-1,时间复杂度是O(n)。

现在又有一组数据:6 5 4 3 2 1 0
根据插入排序的规则,第二个数和第一个数相比(5和6),小于,交换,继续,位置到开头,跳出循环;
此时数据:5 6 4 3 2 1 0
第三个数和第二个数相比(4和6),小于,交换==>(5 4 6 3 2 1 0)继续,第二个数和第一个数比较(4和5),小于,交换==>(4 5 6 3 2 1 0),继续,位置到开头,跳出循环。
此时数据: 4 5 6 3 2 1 0
继续比较…
则第一个数1+2+3+…+n-1=n²+n+1(大概是这样一个表达式),所以时间复杂度是O(n²)。

总结,那么时间复杂度是多少呢,是O(n²),我们规定常数操作的最多数量(采取最差的数据情况)为算法的时间复杂度。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值