排序算法总结(二)——插入排序

c语言三子棋详解!!! (电脑智能下棋)(附上完整代码) 三字棋详细讲解,附上完整代码 阅读详情

1.直接插入排序
基本思想:将无序序列隐式的分成两部分,一部分是有序的,一部分是无序的,通过比较大依次将无序部分中的元素插入在有序部分中的正确位置上。
初始时,有序部分有且仅有一个元素,每次插入后,有序部分元素增加一个,无序部分减少一个。插入排序的关键是如何正确找到插入点。

算法步骤:
A. 初始时,选择a[0]作为有序部分;
B. 将a[1]与a[0]比较,如果a[1] < a[0],将两者交换;此时a[0]a[1]即为有序部分;
C.从后向前遍历有序部分,将a[2]与a[1]进行比较,如果a[2] < a[1],则进行交换;以此将a[1]与a[0]进行比较,同样a[1] < a[0]则进行交换,由此将原始序列中的a[3]插入到合适位置上。
D. 以此类推,将a[i]插入到有序部分合适的位置。

代码实现如下:

public class InsertedSort {

    public static void main(String[] args) {
        int[] a = {2,3,1,4,6,0};
        sort(a);
        for(int i = 0;i<a.length;i++)
            System.out.println(a[i]);

    }

    public static void sort(int[] a){
        int len = a.length;
        for(int i=1;i<len;i++){
            for(int j=i-1;j>-1;j--){
                if(a[j+1]<a[j]){
                    int temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                }
            }
        }
    }
}

2.折半插入排序
折半查找是对直接插入查找的改进,直接插入查找是不断从尾到头遍历、比较、移动将待插入的元素插入到正确的位置,但是因为被插入的序列是有序的,所以可以直接通过折半查找在有序序列中找到插入点。
基本思想:通过折半查找找到元素插入点,然后移动数据,插入元素。

代码实现:

public class HalfInsertSort{

    public static void main(String[] args) {
        int[] a = {5,3,1,4,6,7,0};
        sort(a);
        for(int i = 0;i<a.length;i++)
            System.out.println(a[i]);
    }

    public static void sort(int[] a){
        int len = a.length;
        for(int i = 1;i<len;i++){
            if(a[i]<a[i-1]){
                int temp = a[i];
                int h = 0; //有序序列头部
                int t = i-1; //有序序列尾部

                //折半查找插入点
                while(h<=t){
                    int mid = (h+t)/2; 
                    if(temp > a[mid])
                        h = mid + 1;
                    else
                        t = mid - 1;
                }

                //while循环结束后,h即为插入点,将h到i的元素依次向后移动
                for(int j=i-1;j>=h;j--){
                    a[j+1] = a[j];
                }   
                //插入到a[h]
                a[h] = temp;    
            }
        }


    }
}

3.希尔排序
同样是这位大神介绍的希尔排序,贼清晰,所以借鉴下,侵权删https://www.cnblogs.com/chengxiao/p/6104371.html

希尔排序是对前面两种插入排序的改进,上面两种插入方法都将待插入值存到临时变量,需要通过不断比较找到插入点,然后多次交换(移动)元素,从而得到有序的目的。
那么如果有一个最小的元素却位于序列的最右端,在排序过程中,所有元素都要向右移动,显然效率是相对来说比较慢的。
希尔排序通过增大插入排序之间的间隔,是个数据之间有跨度的移动,而不是一格格的移动,并且在每轮排序后,缩小上次间隔,继续排序。进行这些排序时的数据项之间的间隔称为增量。

希尔排序的基本步骤:
初始时,选择增量step=length/2,并且以step=step/2的幅度缩小增量,直到增量为1。
根据数据之间的增量,便将无序序列分为step个组,每个组分别进行直接插入排序。

如下图所示:

代码实现:
在希尔排序中,根据增量进行分组,每组依次进行直接插入排序,这样的话,需要4层循环才能完成(一层为step调成,一层为处理分组,两层进行直接插入)。
所以实现上可以循环按照分组来,从第step开始,跨组处理,每组之间并不会互相影响。

public static void sort(int[] a){
        int len = a.length;
        int step = len/2;

        //第一层for循环调整step;第二层从第step个元素开始,跨组进行直接插入排序
        for(step = len/2; step>0;step/=2){
            for(int i=step;i<len;i++){
                for(int j = i-step; j>-1; j -= step){
                    if(a[j]>a[j+step]){
                        int temp = a[j];
                        a[j] = a[j+step];
                        a[j+step] = temp;
                    }
                    //若出现待插入元素大于当前元素,那么即完成插入,无需进行下面步骤
                    else
                        continue;
                }
            }
        }

    }
}
漫谈经典排序算法:二、各种插入排序解析及性能比较 1、序言 这是《漫谈经典排序算法系列》第二篇,解析了各种插入排序算法。主要包括:直接插入排序、折半插入排序、表插入排序、希尔插入排序。每一种算法的开头都叙述了引出该算法的原因,然后给出代码,最后分析算法效率及和其他插入排序相比,优劣在哪里。 各种排序算法的解析请参考如下: 阅读详情

相关推荐

基于SSM的足浴管理系统(源码+开题)

研究内容: 本研究的内容主要包括以下几个方面:首先,我们需要对现有的足浴管理系统进行深入的研究和分析,了解其优缺点;最后,我们需要对新设计的系统进行评估和优化,以满足用户的需求和提升系统的使用体验。因此,开发一种基于SSM的足浴管理系统,能够有效地解决这些问题,提高足浴服务的质量和效率。研究目的: 本研究的主要目的是设计和实现一个功能完善、操作简便、用户体验良好的基于SSM的足浴管理系统。通过对系统的研究和设计,我们希望能够为足浴服务行业提供一个高效、便捷的工具,从而推动足浴服务行业的发展。

林科程序设计 1682

MongoDB——插入操作详解

插入文档 向集合中插入一条或多条文档。语法: db.collection.insert( { //可选字段 writeConcern:<document> ordered: <boolean> }, { //可选字段 writeConcern:<document> ordered: <boolean> }, ... ) db为数据库名,collection为集合名,insert为插入文档命令。 可选字段: writeCon

吴声子夜歌的博客 3万+

VS2022如何兼容老项目?.NET Framework 4.0/4.5安装避坑指南

本文提供了在Visual Studio 2022中兼容和维护.NET Framework 4.0/4.5等老旧项目的完整解决方案。针对VS2022无法直接识别旧框架的核心问题,文章详细剖析了原因,并重点推荐通过官方NuGet包安全获取引用程序集的方法,给出了从下载、解压到部署至标准目录的详细步骤。同时,文章还深入探讨了项目文件格式过旧、NuGet包还原失败等进阶问题的排查与解决策略,旨在帮助开发者高效、稳定地在现代开发环境中维护历史代码库。

weixin_27734811的博客 513

数据结构:顺序表

这个比从最前面插入的要简单,因为直接放下去就可以了。//空间不够 realloc扩容这个最简单,直接size- -就ok了,你可能会说:“啊?这样就可以了?”因为size- -之后原先数组中第size个元素就不在数组之中了,后续各种操作都和它无关了,你如果确实过意不去的话,就把它置为0。assert(ps);assert(!ps->size--;

Ice_Sugar_7的博客 5267

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1604

【HCIP-AI 进阶之路(一)】零成本白嫖算力,7天速通华为人工智能资深开发者认证

《HCIP-AIEIDeveloper认证备考指南》摘要:本文深度解析华为HCIP-AI(H13-331)认证考试要点,涵盖考试大纲、评分标准及备考策略。重点剖析昇腾AI全栈架构,包括达芬奇架构核心计算单元(Cube/Vector/Scalar Unit)和四大层级关系(芯片-CANN-框架-应用)。针对无硬件资源的开发者,提供MindSpore CPU版、ModelArts免费算力和沙箱实验室三种零成本实践方案。文章强调该认证对国企/华为生态企业求职者的价值,并指出多选题是主要失分点。下篇将聚焦计算机视觉

2301_82049134的博客 1181

数据库基础之插入数据

如何利用SQL的INSERT语句将数据插入表中。 1、数据插入 INSERT用来将行插入(或添加)到数据库表。插入有几种方式: 插入完整的行; 插入行的一部分; 插入某些查询的结果。 提示:插入及系统安全 使用INSERT语句可能需要客户端/服务器DBMS中的特定安全权限。在你试图使用INSERT前,应该保证自己有足够的安全权限。 1.1、插入完整的行 把数据插入表中的最简单方法是使用基本的INSERT语法,它要求指定表名和插入到新行中的值。下面举一个例子: 输入: INSERT

qq_41720578的博客 4万+

【WRF数据准备】基于Python更新geo_em.d0.nc文件中Albedo/LAI等静态地理数据

基于Python更新geo_em.d0.nc文件中Albedo/LAI等静态地理数据

WW、forever的博客 589

MySQL插入数据的多种方式

这里如果提示不允许也需要修改配置文件【注意:不太建议开启 ,记得及时关闭,有安全风险!使用命令行方式导入数据,这种方式比较简单,百度搜一下即可。这种方式首先得准备好要插入的数据文档,然后进行插入。

天涯何处无芳草,相逢何必曾相识。 1万+

利用Python实现Springer文献关键词爬虫

🔧 如何分析Springer的搜索结果HTML结构🕷️ 编写高性能异步爬虫抓取论文元数据📊 使用Pandas导出Excel🧠 如何处理作者、摘要、DOI等字段🔄 如何优化爬虫稳定性与可扩展性。

2201_76125261的博客 414

树莓派 5 AI 套件(Hailo)示例

该用户自定义类作为输入传递给回调函数,该函数在管道输出上运行。它用于主程序与回调函数之间的通信。它对 hailo_rpi_common::app_callback_class 进行了扩展,并可根据应用程序的具体情况定制附加变量和方法。

机器人控制与仿真应用 4115

排序算法二 插入排序

排序算法二 插入排序选择排序排序原理java代码实现时间复杂度分析 选择排序 排序原理 插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。 下面是排序过程示意图: java代码实现 public static void main(String[] args) { int[] arr

qq_43034235的博客 570

【C++】DDS:FastDDS环境配置与使用示例

FastDDS环境配置与使用示例

DevFrank的博客 6505

排序算法二 插入排序

插入排序:每次将待排序的记录,按关键字大小,将其插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成。 直接插入排序、折半插入排序 实现步骤:设数组为arr[0...n-1] 1、初始时,arr[0]自成1个有序区,无序区为arr[1...n-1]令i=1; 2、将arr[i]并入当前的有序区arr[0...i-1]中形成arr[0...i]的有序区间。查找到arr[i]在arr

丹妮专栏 495

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

常见算法之排序算法二【插入排序】

什么是插入排序!简单的介绍一下它的思想(假设为升序):在已经排好序的数组内,插入新的元素,从后往前找,当找到某个比它小的数,则停止,并将它插入这个与上一个数之间。先给大家看个图: 具体算法描述如下: 1.从第一个元素开始,因为只有一个元素,所以它有序。 2.拿它后面的一个元素和它进行比较。 3.它后面的元素比它大,把他往后移,并把它后面的元素赋给它原来的位置。 4.重复3的动作,

wangduoxong的专栏 729

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

排序算法总结(二)插入排序

学习总结了插入排序算法,用C语言实现一个插入排序函数,对算法进行改进,减少移动元素的次数,用C语言实现改进算法。

tomcoding的博客 646

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

排序算法(二)————插入排序

**实现过程与原理:**对于给定的几个数,先将第一个数看做有序序列,然后将第二个数插入到有序序列中,使整个序列再次有序化,再将第三个数插入到前面的有序序列中,如此往复,即为插入排序原理。 例: 现有给定几个数:21 39 18 16,请使用插入排序将它们从小到大排序 解: 21 39 18 16 现将21看作是有序序列,我们将39插入并排序 第一趟:将39插入 39大于21 故排序后: 21 ...

weixin_43653187的博客 359

排序算法二之插入排序

参考http://blog.youkuaiyun.com/morewindows/article/details/6665714 基本思想:将一个待排序的数插到前面已经排好的队列中,初始的时候a[0]是一个排好的队列。 #include #define N 5 void swap(int *a,int *b) { int temp; temp=*b; *b=*a; *a=temp; } /*

cqkxboy168的专栏 759

【算法】排序算法(二)——插入排序

本篇博文旨在介绍排序算法中的插入排序;介绍了直接插入排序和希尔排序,并通过时间复杂度和空间复杂度进行了分析;最后用代码实现了直接插入排序和希尔排序 插入排序 基本思想 //第一部分有序,从无序区间的第一个数,找到合适的位置插入到有序的数组中 图解 时间复杂度和空间复杂度 插入排序的优缺点 优点:元素少的时候,效率很高 缺点:在元素多的时候,需要挪动狠多元素,并且在逆

皓皓松的博客 1042

排序算法(二)折半插入排序

折半插入排序的主要思想是在一个有序序列中找到新元素在该序列中的位置,然后插入。因为前半部分是已经排好序的序列,所以我不用再按顺序依次查找插入点,采用折半查找来加快插入的速率。 具体操作为:在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元素...

weixin_44792333的博客 282

排序算法_C++(二)插入排序之折半插入排序

折半插入排序又称为二分法插入排序。此排序算法的”折半“是指无序表中的元素要插入到有序表中,该插到哪个位置?在有序表中寻找插入位置的方法是二分查找法。所以叫做折半插入。 i  0 1 2 3 4 5 6 7 8 9 原始序列       21 25 49 25* 16 08 62 38 71 54 第 六  趟        08 16 21 25 25* 4

Forest的博客 887

排序算法(二)之插入排序

插入排序 思想: 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 package com.tangbaobao.sort; import org.junit.Test; import java.util.Arrays; public class InsertSort { @Test pub...

tangyaya8的博客 200

基础排序算法(二)——插入排序

之前写了一个冒泡排序算法,这里在加一个插入排序算法,链接里讲得也比较详细,不过为了熟练,还是自己亲自敲一遍,再次贴出来,分享一下 还是先上代码: public void InsertSort(int[] array) { int j = 0,temp; int count = array.Length;

龙心之火 1020

排序算法(二) 插入排序

插入排序: 从头到尾遍历数组 将当前元素同当前元素之前的所有元素对比 如果,当前元素小于其之前元素,将当前元素向前移,直到使当前元素之前的所有元素按大小排好序 代码如下: package com.robert.paixu; /** * 插入排序 * 从小到大排序 * @author Administrator */ public class InsertSortA

zbwork000的专栏 408

排序算法(二)插入排序

基础:排序算法(二)插入排序 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。 插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 插入排序 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; /* ...

jerryzhou的博客 415
上一篇: 排序算法总结(一)——选择排序
下一篇: 排序算法总结(三)——交换排序
小菜鸟要高飞
博客等级 码龄12年 14粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值