排序第三篇 直接插入排序

news/2024/7/24 1:06:13 标签: 数据结构, 算法, 排序算法

插入排序的基本思想是: 每次将一个待排序的记录按其关键字的大小插入到前面已排好序的文件中的适当位置, 直到全部记录插入完为止

一 简介

插入排序可分为2类
在这里插入图片描述
本文介绍 直接插入排序
它的基本操作是: 假设待排充序的记录存储在数组 R[1…n] 中, 在排序过程的某一时刻, R被划分成两个子区间, R[1…i-1]R[i…n], 其中前一个为已排序的有序区, 后一个为无序区, 开始时有序区中只含有一个元素 R[1], 无序区为 R[2…n] .

排序过程中,只需要每次从无序区中取出第一个元素, 把它插入到有序区的适当位置, 使之成为新的有序区, 依次这样经过 n − 1 n-1 n1 次插入后, 无序区为空, 有序区中包含了全部 n n n 个元素, 至此排序完毕。

以java为例, 看一个demo.


import java.util.Arrays;

/**
 * 2024.2.19
 * 插入排序
 */
public class InsertSort {


    public static void main(String[] args) {

        Integer[] array_ = new Integer[]{30,45,10,30,50};
        System.out.println("初始顺序\n"+ Arrays.toString(array_));
        insertSort(array_);
        System.out.println("最后顺序\n"+Arrays.toString(array_));
    }

    static void insertSort(Integer[] array){

        for(int i=1; i<array.length; i++){    //第0位 独自作为有序数列, 从1开始, 说明第二部分从第二个元素操作
            if(array[i]<array[i-1]){       // 0~ i-1位为有序,  如果当前值 小于 前面一个值
                int temp = array[i];       //将当前值 赋值给 临时变量
                int j = i-1;
                //从第i-1位向前遍历并移位, 直到找到小于第 i 位值停止
                for(; j>=0 && temp < array[j]; j--) {   //j-- 说明是从后面往回走, 然后找插入位置
                    array[j+1] = array[j];      // 将记录后移一位
                }
                array[j+1] = temp;      // 将基准插入到正确位置
            }
        }
    }
}

程序运行结果:
在这里插入图片描述

直接插入排序

二 原理

直接插入排序算法 有两重循环, 外循环表示要进行 n − 1 n-1 n1趟排序, 内循环表明完成一趟排序所进行的记录间的比较和记录的后移。 在每一趟排序中, 最多可能进行 i 次比较, 移动 i + 1 i + 1 i+1 个记录(后循环前后作两次移动)

所以在最坏的情况下(反序) , 插入排序的关键字之间比较次数和记录移动次数达最大值。

最大比较次数: C m a x = ∑ i = 2 n = ( n + 2 ) ( n − 1 ) 2 C_{max} = \sum_{ i=2}^{n }=\frac{(n+2)(n-1)}{2} Cmax=i=2n=2(n+2)(n1)

最大移动次数: M m a x = ∑ i = 2 n ( i − 1 ) = ( n + 4 ) ( n − 1 ) 2 M_{max} = \sum_{ i=2}^{n}{(i-1)}=\frac{(n+4)(n-1)}{2} Mmax=i=2n(i1)=2(n+4)(n1)

三 时间复杂度和空间复杂度

由上述分析可知, 当原始数组的初始状态不同时, 直接插入排序算法的时间复杂度有很大差别, 最好的情况是数组初始为正序即升序, 此时的时间复杂度为 O ( n ) O(n) O(n).

最坏的情况是数组初始状态为反序, 此时的时间复杂度为 O ( n 2 ) O(n^{2}) O(n2) .

容易证明该算法的平均时间复杂度也为 O ( n 2 ) O(n^{2}) O(n2). 这时因为对当前无序区 R [ 2.. i − 1 ] ( 2 ⩽ i ⩽ n ) R[2..i-1] (2 \leqslant i\leqslant n) R[2..i1](2in), 平均比较次数为 ( i − 1 ) / 2 (i-1) / 2 (i1)/2,所以总的比较和移动次数约为 n ( n − 1 ) / 4 ≈ n 2 4 n(n-1) /4 \approx \frac{n^2}{4} n(n1)/44n2.

算法的空间复杂度 S ( n ) 为 O ( 1 ) S(n) 为 O(1) S(n)O(1)

注意概念: 若排序算法所需要的额外空间相对于输入数据量来说是一个常数, 则称该排序为就地排序。
直接插入排序是一个就地排序。


http://www.niftyadmin.cn/n/5382894.html

相关文章

ActiveMQ高可用架构涉及常用功能整理

ActiveMQ高可用架构涉及常用功能整理 1. activemq的集群模式2. 镜像模式高可用系统架构和相关组件2.1 架构说明2.2 相关概念说明2.3 消息模型2.3.1 点对点2.3.2 发布订阅 3. activemq常用命令4. activemq配置集群5. 疑问和思考5.1 activemq的数据删除策略是怎样的&#xff1f;5…

C#使用 AutoUpdater.NET 实现程序自动更新

写在前面 开发桌面应用程序的时候&#xff0c;经常会因为新增功能需求或修复已知问题&#xff0c;要求客户更新应用程序&#xff0c;为了更好的服务客户&#xff0c;通常会在程序启动时判断版本变更情况&#xff0c;如发现新版本则自动弹出更新对话框&#xff0c;提醒客户更新…

【conda环境 安装 tensorflow2.2】 解决方案

1.检查anaconda安装&#xff1a;在cmd输入 conda --version 2.检测已经安装的环境&#xff1a;conda info --envs 3.新建一个python3.5的环境&#xff0c;tensorflow&#xff1a; ###conda create -n xxx python3.5 xxx为虚拟环境名 ###conda create -n xxx python3.6 xxx为虚拟…

Eclipse - Text Editors (文本编辑器)

Eclipse - Text Editors [文本编辑器] References Window -> Preferences -> General -> Editors -> Text Editors Displayed tab witdth: 4 勾选 Insert spaces for tabs 勾选 Show line number References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.n…

如何通过AI作画?

网址&#xff1a;https://huggingface.co/spaces/prodia/fast-stable-diffusion 模板网址&#xff1a;https://prompthero.com/prompt/96ee86ae9e2 打开模板网址&#xff0c;选择Stable Diffusion 选择图片&#xff0c;复制prompt和Negative prompt 打开https://huggingface.…

git checkout 某个分支后如何回退到执行之前的分支

在 Git 中&#xff0c;你可以使用 git checkout - 命令将工作目录切换回之前所在的分支。这个命令会将你的工作目录切换回上一个分支&#xff0c;就好像你执行了 git checkout 切换到上一个分支一样。 以下是操作步骤&#xff1a; 在命令行中执行 git checkout -。 这将会将你…

unplugin-vue-components解决命名冲突

我们在vue项目中通常会利用unplugin-vue-components插件进行自定义组件的自动引入 注&#xff1a;如果不知道怎么配置unplugin-vue-components插件&#xff0c;欢迎看我整理的这篇&#xff1a; vue3项目配置按需自动引入自定义组件unplugin-vue-components 当出现同名文件时&a…

【常识】大数据设计基础知识

底层存储&#xff1a;hadoop&#xff08;hdfsmapreduce&#xff09; Hadoop已经有十几年的历史&#xff0c;它是大数据领域的存储基石&#xff0c;HDFS目前仍然没有成熟替代品;MapR 文件系统在业内已经具有一定知名度了&#xff0c;不仅 MapR 宣布它自己的文件系统比 HDFS 快2-…