本文已收录于专栏 《算法合集》


一、简单释义

1、算法概念

合适的位置插入,他简单明了但是速度很慢。

2、算法目的

有序数组

3、算法思想

新的并且记录数增1的有序表。

二、核心思想

  1. –已经排序好的有序表;
  2. –有序表插入一个新的记录,形成一个新的有序表;

三、图形展示

直接插入排序(Straight Insertion Sort)_有序表

  1、第一次排序:首先2和8进行比较,8比2大所以不交换位置。
  2、第二次排序:首先1和8进行比较,1比8小所以交换位置,然后1和2进行比较,1比2小交换位置。
  3、第三次排序:首先4和8进行比较,4比8小所以交换位置,然后4和2进行比较,4比2大不交换位置,最后4和1进行比较,4比1大不交换位置。
  4、第四次排序:首先9和8进行比较,9比8大所以不交换位置,后面以此类推。

四、代码实现

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl.Algorithm.Partition
 * @Author: Wuzilong
 * @Description: 直接插入排序
 * @CreateTime: 2023-04-26 09:27
 * @Version: 1.0
 */

public class InsertionSort {
    public static void insertionSort(int[] num){
        for (int i =1; i<num.length;i++){
            if (num[i]<num[i-1]){
                int temp=num[i];
                for (int j=i; j>=0;j--){
                    if (j>0&&num[j-1]>temp){
                        num[j]=num[j-1];
                    }else{
                        num[j]=temp;
                        break;
                    }
                }
            }
            System.out.println(Arrays.toString(num));
        }

    }


    public static void main(String[] args) {
        int[] num={2,8,1,4,9,5,7};
        insertionSort(num);
    }

运行结果

直接插入排序(Straight Insertion Sort)_排序算法_02

五、算法描述

1、问题描述

  每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止

2、算法过程

整个算法过程分为以下几步:
  1)每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
  2)第一趟比较前两个数,然后把第二个数按大小插入到有序表中。
  3)第二趟把第三个数据与前两个数从后向前比较,把第三个数按大小插入到有序表中。
  4)依次进行下去,进行了(n-1)趟比较以后就完成了整个排序过程。

3、算法总结

两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

六、算法分析

1、时间复杂度

最好的情况下,也就是排序本身是有序的,共需比较n-1次,因为没有移动的记录,时间复杂度为O(n)。最坏的情况下,即排序表是逆序的情况,时间复杂为O(n²)。

2、空间复杂度

辅助空间单元,所以空间复杂度是O(1)。