插入排序算法的实现和优化~

news2024/9/21 4:23:00

插入排序的基本思想:

在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好序的记录子集中,直到将所有待排记录全部插入为止

直接插入排序:

直接插入排序是一种最基本的插入排序方法,元素的插入和排序同时进行,其基本操作为,如下图所示:

在这里插入图片描述

文字描述(以升序为例):

1:将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)
2:重复以上步骤,直到整个数组有序

package bin_find;

import java.util.Arrays;

public class Insert_sort {
    public static void main(String[] args) {
        int arr[]={3,1,29,4,8,10,71,22};
        sort(arr);
    }
    public static void sort(int arr[]){
        //起初将数组的第一个元素视为有序区域,剩下元素即为无序区域,因此无序区域应为下标为1的元素
        for(int i=1;i<arr.length;i++){
            //暂存区域的元素始终为无序区域的第一个元素
            int t=arr[i];
            //j始终为有序区域的最后一个元素下标
            int j=i-1;
            //该循环完成的是比较+移动的操作,循环次数为比较次数,也就是有序数组的长度
            while(j>=0){
                //当暂存区域元素小于有序区域的最后一个元素时
                if(t<arr[j]){
                    //将有序区域的元素向后移动一位
                    arr[j+1]=arr[j];
                }
                //否则本轮排序结束
                else{
                    break;
                }
                j--;//表示将暂存区域的元素与有序区域的元素一一进行比较,直到比较完有序区域的第一个元素
            }
            arr[j+1]=t;//将元素插入对应的位置
            System.out.println("第"+i+"趟插入排序的结果为:"+Arrays.toString(arr));
        }
    }
}

输出如下:

1趟插入排序的结果为:[1, 3, 29, 4, 8, 10, 71, 22]2趟插入排序的结果为:[1, 3, 29, 4, 8, 10, 71, 22]3趟插入排序的结果为:[1, 3, 4, 29, 8, 10, 71, 22]4趟插入排序的结果为:[1, 3, 4, 8, 29, 10, 71, 22]5趟插入排序的结果为:[1, 3, 4, 8, 10, 29, 71, 22]6趟插入排序的结果为:[1, 3, 4, 8, 10, 29, 71, 22]7趟插入排序的结果为:[1, 3, 4, 8, 10, 22, 29, 71]

优化方式:

1.待插入元素进行比较时,遇到比自己小的元素,就代表找到了插入位置,直接循环退出,无需进行后续比较

2.插入时可以直接移动元素,而不是交换元素

与选择排序比较:

1:二者平均时间复杂度都是 0(n^2)
2:大部分情况下,插入都略优于选择
3:有序集合插入的时间复杂度为 0(n)
4:插入属于稳定排序算法,而选择属于不稳定排序

上述的选择排序并不是最优的,当某些元素从起始位置移动到最终位置需要移动的次数过多时,这会很麻烦,如下所示:

假设我们需要将下述的无序数组通过插入排序使之成为有序数组,那么元素9会移动7次!

在这里插入图片描述

对于这种情况,我们可以使用希尔排序!

希尔排序:[掌握思路]

步骤:

以上述实例为例进行:

第一步:选择间距为4的元素进行插入排序

!

排序后的结果为:

在这里插入图片描述

第2步:选择间距为2的元素进行插入排序

在这里插入图片描述

排序后的结果为:

在这里插入图片描述

第3步:选择间距为1的元素进行插入排序,也就是普通的插入排序,排序结果如下:

在这里插入图片描述

使用希尔排序,我们通过上述步骤,可以看出元素9只移动了3次

对于间隙的选择是多种多样的,不同的队列选择它的时间复杂度也是不同的,这里我们主要学习它的思路

练习题:

one:

在这里插入图片描述

答案为:9,18,19,23,23,15

two:

在这里插入图片描述

答案为:9,15,18,19,23,23

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

离线召回与排序介绍

3.3 离线召回与排序介绍 学习目标 目标 了解召回排序作用知道头条推荐召回排序设计应用 无 3.3.1 召回与排序介绍 召回&#xff1a;从海量文章数据中得到若干候选文章召回集合(数量较多) 排序&#xff1a;从召回集合中读取推荐文章&#xff0c;构建样本特征进行排序过滤筛选…

【SpringCloud21】面试题雪花算法

目录1. 问题2.ID生成规则部分硬性要求3.ID号生成系统的可用性要求4.一般通用方案4.1UUID4. 数据库自增主键5. 基于Redis生成全局id策略6. snowflake6.1 概述6.2 结构6.3 源码6.4 工程落地经验6.4.1 糊涂工具包6.4.2 springboot整合雪花算法1.POM2.核心代码IdGeneratorSnowflake…

ElasticSearch7.6.x 学习笔记

ElasticSearch7.6.x 学习笔记 目录 ElasticSearch概述 ElasticSearch&#xff0c;简称es&#xff0c;es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据。且本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数…

Spring事务、事务隔离级别、事务传播机制

Spring事务和事务传播机制一、为什么需要事务&#xff1f;(回顾)二、Spring中事务的实现2.1 MySQL中的事务使用 (回顾)2.2 Spring编程式事务2.3 Spring 声明式事务2.3.1 Transactional 使用2.3.2 Transactional 作用范围2.3.3 Transactional 参数说明2.3.4 注意事项2.3.4 Trans…

【微服务】Nacos注册中心

Nacos和Eureka一样也可以充当服务的注册中心&#xff0c;让我们一起看看有何区别&#xff1f; 点击跳转&#x1f449;【微服务】Eureka注册中心 一.引入 Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比于Eureka其功能更加丰富&#xff0c;在国内受欢迎…

2. 获取数字证书,搭建nginx服务器,验证https请求

文章目录 一、 前提知识二、获取数字证书三、搭建nginx服务器3.1 安装nginx操作步骤3.2 导入证书3.3 修改nginx配置文件四、验证一、 前提知识 首先我们知道访问域名时,http请求默认端口为80,https为443。那么我们现在就需要对这两个端口进行监听,这里我们就要用到nginx服务…

数据结构 最短路径课设(源码+实验报告+视频讲解)(用了自取)

XIAN TECHNOLOGICAL UNIVERSITY 课程设计报告 实验课程名称 算法与数据结构 专 业&#xff1a; 班 级&#xff1a; 姓 名&#xff1a; 学 号&#xff1a; 实验学时&#xff1a; 指导…

插入排序实现

场景&#xff1a; 插入排序&#xff0c;一般也被称为直接插入排序。 对于少量元素的排序&#xff0c;它是一个有效的算法 。 插入排序是一种最简单的排序方法&#xff0c;它的基本思想是将一个记录插入到已经排好序的有序表中&#xff0c;从而一个新的、记录数增1的有序表。在…

分享135个ASP源码,总有一款适合您

ASP源码 分享135个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 135个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1rHFniMK56P-_qXNY9kKihg?pwdl95g 提取码&#x…

day11文件夹导航条+文件从数据库和cos删除

获取临时凭证&&上传文件 1创建COS_OBJECT对象 new一个&#xff0c;然后就会向你写的url地址获取临时凭证&#xff08;需要引入一个JS&#xff09; 2.写url地址和url的函数&#xff0c;后台写函数获取到临时凭证&#xff0c;有文档直接调用就可&#xff0c;然后后台返回…

【C++】右值引用和移动语义 | 新的类功能 | 可变参数模板

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;左值引用…

HTTPS 是这样握手的

HTTP协议默认是明文传输&#xff0c;存在一定的安全隐患&#xff0c;容易被中间人窃听和攻击&#xff0c;在 加密解决HTTP协议带来的安全问题 中提到使用哈希、对称加密、非对称加密等方式对数据加密&#xff0c;能解决数据安全的问题。 以上加密方式需要我们手动的使用加密算…

python基础——列表切片操作

python基础——列表切片操作 文章目录python基础——列表切片操作一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤一、实验目的 掌握列表切片操作 二、实验原理 1、列表是写在方括号[]之间、用逗号分隔开的元素列表。列表可以完成大多数集合类的数据结构实现…

23种设计模式(二十三)——解释器模式【邻域问题】

文章目录 意图什么时候使用解释器真实世界类比解释器模式的实现文法抽象语法树解释器模式的优缺点亦称:Interpreter 意图 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。 在软件系统中,如果有一些特殊的领域问题较为复杂,疑…

基于springboot物资管理系统源码含论文

摘要 目前&#xff0c;大型物资作为社会零售业态中最为重要的组成部分&#xff0c;处于社会零售商业 进入高速发展的轨道阶段&#xff0c;其在社会经济发展的作用日益明显。国内各大大型基本 上都拥有自己的社会网&#xff0c;将社会物资管理纳入网络管理系统&#xff0c;实现…

JDK8 新特性之并行的Stream流

目录 一&#xff1a;串行的Stream流 二&#xff1a;并行的Stream流 获取并行Stream流的两种方式 小结 三&#xff1a;并行和串行Stream流的效率对比 四&#xff1a;parallelStream线程安全问题 五&#xff1a;parallelStream背后的技术 Fork/Join框架介绍 Fork/Join原理…

RK3399平台开发系列讲解(内存篇)访问虚拟内存的物理内存过程

🚀返回专栏总目录 文章目录 一、虚拟地址的表示二、虚拟地址到物理地址的转换三、Linux页表沉淀、分享、成长,让自己和他人都能有所收获!😄 📢虚拟内存这一概念给进程带来错觉,使它认为内存大到几乎无限,有时甚至超过系统的实际内存。每次访问内存位置时,由CPU完成从…

static_cast,dynamic_cast,const_cast详解

目录 一.static_cast&#xff08;静态转换&#xff09; 二.dynamic_cast&#xff08;动态转换&#xff09; 三.const_cast 一.static_cast&#xff08;静态转换&#xff09; 1.语法&#xff1a; static_cast<new_type>(expression); newtype dataname static_cast…

分享133个ASP源码,总有一款适合您

ASP源码 分享133个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 133个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1l_8UHQkosNF3HHTu8AFq5A?pwdyxvw 提取码&#x…

欧几里得与扩展欧几里得算法(含推导过程及代码)

文章目录前言一、欧几里得算法二、扩展欧几里得算法2.1、认识裴蜀定理2.2、推导axbygcd(a, b)得到x与y2.2.1、推导过程2.2.2、代码实现2.3、推导axbygcd(a, b)的所有解及a或者b的最小值&#xff08;结论验证&#xff09;参考文章前言 在学习Acwing c蓝桥杯辅导课第八讲数论-Ac…