自学算法之手撕插入排序

关于插入排序,分析其时间复杂度的时候,需要根据数据状况进行分析。

  • 初认,插入排序
    1. 插入排序工作原理:

      • 通过构建有序序列,对于未排序的数据,在已排序的序列中从后向前扫描,找到相应的位置并插入。
    2. 插入排序分类:

      • 直接插入排序
      • 希尔排序
      • 折半插入排序
    3. 原理流程图:

      • 假设数组[3,1,4,2,5],初始下标为0的位置,默认为已排序。

      • 第一次,进行插入排序,下标范围为[0,1],也就是数值1,进行寻找合适位置的插入,1应该插入到3的前面。

        在这里插入图片描述

      • 第二次,下标范围变成[0,2],即数值4加入排序序列,应为满足升序所以不需要进行插入。

        在这里插入图片描述

      • 第三次,下标范围变成[0,3],即数值2加入排序序列,2的位置应该在3的前面,所以进行合适的插入。

        在这里插入图片描述

      • 第四次,下标范围变成[0,4],最终使数组有序。

        在这里插入图片描述

      • 就像打斗地主,每次拿牌的时候都会整理一下,遇到顺子都需要手动将牌插到合适的位置。

        在这里插入图片描述

  • 直接插入排序代码
    1. 代码很简单,笔者就不做过多叙述。其他的排序代码,笔者并不想学,哈哈。

      	public static void sort(int[] arr) {
      		// 参数检查
      		if(arr.length < 2 || arr == null) return ;
      		// 下标0, 默认为有序
      		for(int i = 1; i < arr.length; i++) {
      			// 每次范围加1
      			for(int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
      				int tmp = arr[j];
      				arr[j] = arr[j + 1];
      				arr[j + 1] = tmp;
      			}
      		}
      	}
      
  • 时间复杂度分析

    1. 直接插入排序和选择和冒泡不一样,直接插入排序和数据状况有关。
      • 比如,最好情况,数组一开始就是有序的,复杂度仅仅是遍历,即O(N)。
      • 最坏情况,即数组倒序[5,4,3,2,1],那么这时候
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值