插入类排序

排序——插入类排序 插入类排序,一般是在一个有序的序列中,插入一个新的元素,要点在于如何找到这个插入的位置。 插入类排序包括:直接插入排序,折半插入排序,希尔排序 直接插入排序 算法思想:每趟将一个待排序的关键字按照其值的大小插入到已经排好的部分有序序列的适当位置上,直到所有关键字都被插入到有序序列中为止。 时间复杂度分析: 空间复杂度:O(1) 最坏情况下,基本操作选取最内层循环中arr[j+1... 阅读详情

~~无论是查资料、翻书、自己总结,总之记了很多笔记,以后慢慢将它分享出来~~

插入类排序的基本思想
在一个已经排好序的有序序列区内,对待排序的无序序列区中记录逐个进行处理,每一步将一个待排序的记录与有序序列区的记录进行比较,然后有序地插入到该有序序列区中,直到待排序的无序序列区处理完毕。

分类
1).直接插入排序(基于顺序查找)
2).折半插入排序(基于折半查找)
3).希尔排序(基于逐趟缩小增量)

直接插入排序
思想:假设记录序列的状态为R[1...i...n],则有序序列区为R[1...i-1],无序序列区为R[i...n],R[i]为无序序列区正在处理的记录。直接插入排序就是利用顺序查找来确定r[i]在有序序列区有序序列区R[1...i-1]中的插入位置。即:将第i个记录的关键字Ki与前面记录R[1...i-1]的关键字从后向前顺次比较,将所有关键字大于Ki的记录依次向后移动一个位置,直到遇到一个关键字小于或等于Ki的记录,该记录的位置即为R[i]的插入位置。
注意:初始时,R[1]自成1个有序区,无序区为R[2...n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。
代码:见下。
平均时间复杂度:O(n^2)。
稳定性:稳定。

折半插入排序
思想:折半插入排序是利用折半查找来确定r[i]在有序序列区有序序列区R[1...i-1]中的插入位置。
代码:见下。
平均时间复杂度:O(n^2)。
稳定性:稳定。

希尔排序
思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
代码:见下。
平均时间复杂度:跟增量的选取有很大的关系。很多情况下“增量每次除以2递减”,时间复杂度为O(n^2)。当按{2k-1,2k-1-1,...,7,3,1}序列取增量时,时间复杂度为O(n^(3/2)),“增量每次除以3递减”也可以达到这种效果。
稳定性:不稳定。

代码:
//直接插入排序

void directInsertSort(int array[],int length)

{

    for (int i=2; i<=length; i++)

    {

        array[0]=array[i];//记录Ki

        int j=i-1;

        for (; array[j]>array[0]; j--)//条件中当j=0时,array[j]>array[0]自然不成立

        {

            array[j+1]=array[j];//如果该记录大于Ki则后移

        }

        array[j+1]=array[0];//上一步条件判断失败时j多走了一个,因此插入到j+1

    }

}


//折半插入排序

void binaryInsertSort(int array[],int length)

{

    for (int i=2; i<=length; i++)

    {

        array[0]=array[i];

        int low=1,hight=i-1,mid;

        while (low<=hight)//此处通过折半查找的方式确定要插入的位置,而不是顺序比较

        {

            mid=(low+hight)/2;

            if (array[0]<array[mid])//若当前记录小于中间位置的记录则heigh缩小

            {

                hight=mid-1;

            }

            else//否则low缩小

            {

                low=mid+1;

            }

        }

//while执行完,low则为要插入的位置,即low之后的记录的关键字都比low位置的大

        for (int j=i-1; j>=low; j--)//前一步已经找出要插入的位置,因此这里直接将比往后移动

        {

            array[j+1]=array[j];

        }

        array[low]=array[0];

    }

}

//希尔排序

void ShellInsert(int array[],int length,int d)

{

    for (int i=d+1; i<=length; i++)//从增量d划分的第一个子序列的第二个记录开始,顺序扫描整个待排序列,对每个扫描到的记录在其所在的子序列进行直接插入排序

    {

        array[0]=array[i];

        int j=i-d;//当前记录所在子序列的前一个记录

        for (; j>0&&array[0]<array[j]; j=j-d)//j=j-d有可能直接跳过j=0,因此需要加上j>0这个条件

        {

            array[j+d]=array[j];

        }

        array[j+d]=array[0];

    }

}

void ShellSort(int array[],int length)

{

    int d=length/2;//初始增量设为数组长度的一半

    while (d>=1)

    {

        ShellInsert(array, length, d);//每次调用,即为一趟排序

        d=d/3;//增量每次除以3递减

    }

}





基于大模型的癫痫手术预测与决策系统技术方案文档 阅读详情

相关推荐

Outlook日历同步全攻略:Win10+安卓+iOS三端无缝衔接(附常见问题解决)

本文提供了一份详尽的Outlook日历同步指南,帮助用户在Windows 10、安卓和iOS三端实现无缝衔接。文章深入解析了Exchange ActiveSync等核心同步原理,并给出了从账户创建到各设备(特别是华为手机)的具体配置步骤、进阶管理技巧以及针对同步失败、事件重复等常见问题的实战解决方案,旨在彻底解决跨平台日程管理的痛点。

l3m4n的博客 552

数据结构之简单排序(浙大mooc笔记)

简单排序的定义(浙大mooc笔记) 文章目录简单排序的定义(浙大mooc笔记)冒泡排序最原始的冒泡排序:冒泡排序的改进:冒泡排序的时间复杂度思考 常见格式:void X_sort(ELementType A[],int N) 大多数情况下,为简单起见,讨论从小到大排序 默认条件: 1.N是正整数 2.只讨论基于比较的排序(> = < 有定义) 3.只讨论内部排序 4.稳定性:任意两个相等的数据,排序前后的相对位置不发生改变 重要的一点:没有任何一种排序是任何情况下都表现最好的 冒泡排序 图例

银色回廊的博客 678

ESP8266 进行HDLC解码,AX.25,APRS

/************************************************************** 函数名:aprs_wait_begin() 参 数:无 返回值:bool true=得到合法脉冲,false=未得到 说 明:等待第1个833us高脉冲,判断范围 730-930,其他忽略 ***************************************************************/ bool aprs_wait_begin(){ stati

蓝蓝的博客 1628

排序——插入类

1.直接插入排序 /** * 数组r的待排区间[low,high] * @param r * @param low * @param high */ public void insertSort(Object[] r, int low,int high) { for(int i=low+1;i<=high;i++){ if(strategy.compar

世上无难事,只怕有心人 456

TCGA数据集介绍及数据下载指南(新手友好篇)

目录一、TCGA数据集介绍1.1 数据集介绍1.2 File介绍1.2.1 Data Category(数据类别)1.2.2 Data Type(数据类型)1.2.3 Experimental Strategy(实验策略)1.2.4 Workflow Type(工作流类型)1.2.5 Data Format(数据格式)1.2.6 Platform(平台)1.2.7 Access1.3 Cases介绍1.3.1 Case ID(案例编号)1.3.2 Primary Site(主要站点)1.3.3 Progra

Wendy的博客 6万+

保姆级教程:用GlobleLand30数据+GTB3.3软件,一步步搞定MSPA景观格局分析

本文提供GlobleLand30数据结合GTB3.3软件进行MSPA景观格局分析的保姆级教程,涵盖数据预处理、软件操作、结果解读全流程,特别针对零基础用户常见问题提供解决方案,助力研究者高效完成景观生态学分析。

weixin_26757925的博客 450

DS_Sorting(Bubble, Insertion, etc.)

对初始数据序列{ 8, 3, 9, 11, 2, 1, 4, 7, 5, 10, 6 }进行希尔排序。本题要求给出希尔排序对给定初始序列{9, 8, 7, 6, 5, 4, 3, 2, 1}利用增量序列{1, 3, 7}进行排序的分步结果。给定初始待排序列{ 15,9,7,8,20,-1,4 }。对于序列{ 49,38,65,97,76,13,27,50 },按由小到大进行排序,下面哪一个是初始步长为4的希尔排序法第一趟的结果?对N个记录进行简单选择排序,比较次数和移动次数分别为O(N2)和O(N)。

m0_61758697的博客 797

硬件基础(4):(6)高精度ADC设计中模拟地与数字地的划分与连接

在实际 PCB 设计中,**接地与布线**对于获得干净的参考电压和高精度 ADC 测量至关重要。下面详细阐述**如何在硬件层面减少数字噪声耦合到模拟电路、保障参考电压的稳定性**。

FCZlll的博客 2645

第十章 排序概念与插入排序-计算机17级(期末复习带详解版)

解析在后面!!! 解析: x2-1: 他问的是可能的比较次数和移动次数分别是多少,那我们就假设原理就是全部递增的,插入排序后要求全部递减,这样的比较次数应该是最多的,即除了第一个进去的元素,其他的每一次新插入的元素都要跟已经插进去的元素做对比,共1一直加到n次(n=9),即45次。 再次注意,他问的是可能,所有a,b,c都不可能,而44注意也是可能,因为如果中间有两个元素相等,他们比较...

markconca的博客 4409

【硬刚Hadoop】HADOOP MAPREDUCE(1):概述

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 2MapReduce优缺点 2.1 优点 1)MapReduce易于编程 它简单的实现一些接口,就可以完成一个分布式程序..

微信搜:import_bigdata,大数据领域硬核原创作者 462

ADS基础教程16 - 存档和导入(workspace、cell、view)

选择workspace_Archive目录作为保存workspace归档的目录,点击打开进行目录选择,点击Finish保存目录。,选择cell_Archive目录作为保存cell归档的目录,点击打开进行目录选择,点击Finish保存目录。,选择view_Archive目录作为保存view归档的目录,点击打开进行目录选择,点击Finish保存目录。(2)在弹框中,可以选择点击Select将参考的条目添加进来,然后点击Next…(2)在弹框中,可以选择点击Select将参考的条目添加进来,然后点击Next…

XZ_ZC的博客 3703

数据结构作业22—排序概念与插入类排序(选择题)

2-1对一组包含10个元素的非递减有序序列,采用直接插入排序排成非递增序列,其可能的比较次数和移动次数分别是: (2分) A.100, 100 B.100, 54 C.54, 63 D.45, 44 作者: DS课程组 单位: 浙江大学 2-2设有1000个元素的有序序列,如果用二分插入排序再插入一个元素,则最大比较次数是:(2分) A.1000 B.999 C.500 ...

banya1999的博客 7530

10.2 全栈 CRUD 工程结构搭建:Cursor 4 步初始化 + 3 层目录规范

揭示 Cursor 工程初始化中 4 个关键动作如何将 AI 上下文感知能力从 30% 提升至 85%,包括用 pnpm create 显式声明结构契约、通过 monorepo.config.json 设定 workspace 根以支持跨包类型引用、在 shared 包中固化共享类型与协议,以及后续

weixin_42545292的博客 67

一、插入类排序

直接插入排序、折半插入排序、表插入排序、希尔排序(缩小增量排序)的思想、代码实现、时间复杂度分析

michael_linux的博客,一个小小小学生。滴水穿石,步步为营,只为那刹那芳华。 3966

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

插入类排序的C语言实现

插入类排序包括直接插入排序、折半插入排序、希尔排序三种。

2302_77530416的博客 862

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

插入类排序法

插入类排序法 (1)直接插入排序,平均时间复杂度是O(n2) 直接插入排序就是从待排序列中选出一个元素,插入到已经有序的元素之中,直到所有的元素都插入到有序序列中所有的元素就全部有序了。通常的做法就是将第一个元素看做是有序的元素(即待排序列的第一个元素看做是有序序列),然后我们将第二个元素和有序序列(即第一个元素)作比较,按正确的序列插入到序列中去。然后在将第三个元素和前面有序序列(即整个待排...

weixin_41924879的博客 544

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

插入类排序算法总结

插入排序总结小计直接插入排序 小计 最近在找工作,越来越意识到算法的重要性,所以准备每天抽出一点时间来整理之前学过的算法,打卡第一天,希望可以坚持久一点。 直接插入排序 直接插入排序是从第二个元素开始,向前找合适的地方插入,插入以后,从插入后该元素所在位置到该元素插入前位置之间的数全部向后移动。 /** * 直接插入排序 * * @param a */ public stati...

qingtianxt的博客 246

排序算法——插入类排序

排序算法是程序设计中最为常用的算法。常用的算法 包括:插入类排序算法、交换类排序算法、选择类排序算法、归并排序算法和基数排序算法。 今天,我们就先来讨论下插入类排序算法。插入排序算法的思想:将待排序元素分成已排序子集和未排序子集,依次从未排序子集中的一个元素插入到已排序子集中,使已排序子集仍然有序。重复执行以上过程,直到所有元素都有序为止。

LaL15281183992的博客 635

7.2插入类排序:

7.2插入类排序: 定义:就是在一个有序的序列中,插入一个新的关键字,直到所有的关键字都插入形成一个有序序列。 直接插入排序就是一种插入类排序。插入类排序还包括折半排序,希尔排序。 折半插入排序: 将比较和移动两个操作分离出来,也就是想利用折半找到插入位置,然后一次性移动元素,再插入该元素。 void InsertSort(ElemType A[],int n){ int i,j,lo...

BossHAO的博客 320

排序算法之插入类排序

插入类排序 插入类排序的思想就是通过向一个已经有序的序列中,插入一个元素,待插入元素通过某种规则找到它的合适位置。常用的三种插入排序有直接插入排序、折半插入排序和希尔排序。 直接插入排序(Straight Insertion Sort) 直接插入排序是最简单的排序算法,在已经有序的序列中,直接插入排序通过找到待插入元素合适的位置,然后直接插入到位置上就可以了。 网上的gif动图: 代...

敲代码的quant的博客 1763

排序算法复习——插入类排序

文章目录排序的定义排序的基本操作、性质和分类排序算法1.插入排序2.读入数据总结 排序的定义 假设数据集合S,一个排序算法sort的功能就是将S的任意元素序列重新排列成一个有序的序列。 显然,对于同一集合的实际数据来说,完全可能存在很多中不同但都有实际意义的序,而且在不同的计算情况下,可能需要对同一个数据序列做不同的排序。因此在对某些数据集做排序时,需要明确说明采用哪种序,比如常用的典型序:整数的“小于等于”、字符串的字典序等。 排序的基本操作、性质和分类 基本操作:(1)比较关键码的操作(这里的

zhangzhang_one的博客 331

PHP数据结构-插入类排序:简单插入、希尔排序

插入类排序:简单插入、希尔排序总算进入我们的排序相关算法的学习了。相信不管是系统学习过的还是没有系统学习过算法的朋友都会听说过许多非常出名的排序算法,当然,我们今天入门的内容并不是直接先从...

硬核项目经理 215

插入类排序总结

插入类排序的基本思想是: 取数组中的第一个数,因为只有一个数,所以认定他为有序的,将剩下的数依次插入有序序列中,并保持他为有序,插入完毕,排序完毕 插入排序的步骤可以分为三步:   1.找到应该插入的位置   2.将这个位置后面所有的数依次往后移动一个单位   3.将要插入的数字插入应该插入的位置 一.直接插入排序 void Insert_Sort...

weixin_30917213的博客 157

常见算法之‘插入类排序’

插入类排序:   每步将一个待排序的记录,按其排序码大小,插到前面已经排序的文件中的适当位置,直到全部插完为止。 1.直接插入排序   1.算法思想:从待排序的第n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置,每次外循环结束后,将当前的数插入到合适的位置。   2.代码:   def insert_sort(array): n=len(array) ...

weixin_30462049的博客 138

3.5.3、查找和排序算法-插入类排序和选择类排序

术语说明稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;例如:数组{1,2,3,3,4,7,6}。如果排序后,两个3的位置没有发生变化就是稳定;若两个3发生了调换就是不稳定ln-place:占用常数内存,不占用额外内存。例如选择排序只需要占用1个内存空间交换元素即可,不需要额外申请内存空间Out-place:不仅占用常数内存,还需要占用额外内存。例如基数排序时间复杂度:一个算法执行所耗费的时间。

yoyo勰的博客 899
下一篇: app跳转 iOS
去趟云南
博客等级 码龄12年 13粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值