直接插入排序(Straight Insertion Sort)

简介: 直接插入排序

一、简单释义

1、算法概念

 对插入第i个记录时,R1、R2、…、Ri-1均已排好顺序。因此,将第i个记录Ri-1、…、R2、R1进行比较,找到合适的位置插入,他简单明了但是速度很慢。

2、算法目的

 把无序数组通过彼此之间比较进行移动形成一个有序数组

3、算法思想

 将一个记录插入到已经排好序的有序表中,从而一个新的并且记录数增1的有序表。

二、核心思想

旧–已经排序好的有序表;

新–有序表插入一个新的记录,形成一个新的有序表;

三、图形展示

f35fdfac1f704fe4a6c91f1e62a931e7.png

 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);
    }

运行结果

da881d69366149fd9470ea7a3353964c.png

五、算法描述

1、问题描述

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

2、算法过程

整个算法过程分为以下几步:

 1)每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

 2)第一趟比较前两个数,然后把第二个数按大小插入到有序表中。

 3)第二趟把第三个数据与前两个数从后向前比较,把第三个数按大小插入到有序表中。

 4)依次进行下去,进行了(n-1)趟比较以后就完成了整个排序过程。

3、算法总结

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

六、算法分析

1、时间复杂度

 首先直接插入排序是一个稳定的排序算法;最好的情况下,也就是排序本身是有序的,共需比较n-1次,因为没有移动的记录,时间复杂度为O(n)。最坏的情况下,即排序表是逆序的情况,时间复杂为O(n²)。

2、空间复杂度

 算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数。在直接插入排序中只使用了i,j,temp这三个辅助空间单元,所以空间复杂度是O(1)。


相关文章
|
7月前
|
搜索推荐 算法 Java
sort-01-bubble sort 冒泡排序算法详解
这是一个关于排序算法的系列文章摘要。作者整理了10种不同的排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序和大文件外部排序。文章详细介绍了冒泡排序的工作原理、流程,并提供了代码实现,强调了在实现中考虑的改进点,如统一接口、实用性增强和日志输出。此外,还提供了一个排序接口和工具类以方便使用,并通过测试代码和日志展示了排序过程。整个系列旨在帮助读者理解和掌握排序算法。相关代码已开源在GitHub。
|
7月前
|
存储
归并排序 merge_sort
归并排序 merge_sort
30 0
|
7月前
|
搜索推荐 算法 Java
sort-08-counting sort 计数排序
这是一个关于排序算法的系列文章摘要。文章详细介绍了多种排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及大文件外部排序。计数排序是一种线性时间复杂度的稳定排序算法,由 Harold H. Seward 在1954年提出。基础版计数排序通过创建一个与最大元素等长的新数组来统计每个元素出现的次数,然后填充排序结果。改良版则考虑了空间浪费问题,通过找出最小值来减少数组长度。此外,还提出了使用 TreeMap 来扩展排序算法以适应非数字元素的情况。
|
7月前
|
搜索推荐 算法 Java
sort-07-merge sort 归并排序
这是一个关于排序算法的系列文章摘要。文章涵盖了多种排序算法的详细解释,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及大文件外部排序。归并排序是一种效率为O(nlogn)的排序算法,基于分治法,将序列分成两半,分别排序后再合并。文章提供了Java实现的递归和迭代版本。在归并排序的递归实现中,代码通过不断拆分和合并子序列完成排序,而迭代实现则是通过逐步增大子序列长度并进行两两归并来排序。整个系列可在GitHub找到相关源码。
|
存储 搜索推荐 算法
计数排序(Counting Sort)详解
计数排序(Counting Sort)是一种非比较排序算法,其核心思想是通过计数每个元素的出现次数来进行排序,适用于整数或有限范围内的非负整数排序。这个算法的特点是速度快且稳定,适用于某些特定场景。在本文中,我们将深入探讨计数排序的原理、步骤以及性能分析。
280 1
计数排序(Counting Sort)详解
|
算法 搜索推荐
经典算法之折半插入排序(Binary Insertion Sort)
经典算法之折半插入排序(Binary Insertion Sort)
340 0
2-路插入排序(Two-Way Insertion Sort)
算法介绍 算法描述 算法分析 代码实现 参考
|
人工智能 算法 搜索推荐
|
搜索推荐 算法 数据可视化
【基础篇】9 # 排序:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)
【基础篇】9 # 排序:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)
120 0
【基础篇】9 # 排序:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)
|
缓存 搜索推荐 算法
图解插入排序——直接插入排序算法(straight insertion sort)
图解插入排序——直接插入排序算法(straight insertion sort)
308 0
图解插入排序——直接插入排序算法(straight insertion sort)