插入排序(常见排序算法)

今天我们不刷力扣了,我们来复习(手撕)一下数据结构中的八大排序算法之一,冒泡排序

基本概念:

英文名:Straight Insertion Sort
也是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表

代码:

import java.util.Arrays;
 
public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {5,4,3,2,1,-1,-5,-3};
        System.out.println("未排序数组:"+ Arrays.toString(arr));
        insertSort(arr);
        System.out.println("未排序数组:"+ Arrays.toString(arr));
    }
 
    public static void insertSort(int[] arr){
        //插入排序从第二个元素开始进行,
         // 所以这里i(作为索引)设为1,循环次数为arr.length-1;
         for (int i=1;i<arr.length;i++){
            int insertIndex = i;
            int insertValue = arr[i];
            //当要排序的元素比前一个元素小时,进入循环
            while (insertIndex > 0 && insertValue < arr[insertIndex-1]){
             //每次arr[i]<arr[i-1],就把arr[i-1]的值往后移,直到arr[i]>arr[i-1]
                arr[insertIndex] = arr[insertIndex-1];
                insertIndex--;
            }
            arr[insertIndex] = insertValue;
        //insertValue 在比较过程中一直没变,
      //最后一步将insertValue的值赋给insertIndex所指的元素
        }
    }
}

核心思路:

第一层循环是遍历整个数组,创建临时变量存储对应的数组下标与值

第二层循环当前数组元素值大于前一个元素值的时候,将两个元素互换

最后 insertvalue相当于临时保存值,等前面排好序后就可以插入对应的位置

算法特点:

  • 从以上过程可得,这个算法是遍历一次所有数,分别插入,但第一个数一定有序,不用排,因此n个数需要n-1次遍历
  • 即i直接从1开始
  • 每一次插入的比较都是从前一个数开始,所以我们可以直接将第二个循环的参数j设为i-1
  • 每一次插入我们首先拿出要插入的数
  • 然后比较,如果大于取出数,就将这个数后移,j-1

1.时间复杂度
最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O ( n ) O(n)O(n)
最坏情况全部反序,内层每次遍历已排序部分,最坏时间复杂度为O ( n 2 ) O(n^2)O(n2)

综上,因此直接插入排序的平均时间复杂度为O ( n 2 ) O(n^2)O(n 2 )

2.空间复杂度
辅助空间是常量
平均的空间复杂度为:O ( 1 ) O(1)O(1)

3.算法稳定性
相同元素的前后顺序是否改变

插入到比它大的数前面,所以直接插入排序是稳定的

 参考资料:

排序算法——直接插入排序(图文超详细!)-CSDN博客

插入排序(常见经典排序算法)_插入排序算法的伪码从第二位开始,依次与前位选择插入位置-CSDN博客

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值