数据结构-插入排序

插入排序

插入排序的三种常见方法:

直接插入排序、折半插入排序、希尔排序。

数据存储结构

因为我们是用的是C语言来实现算法,因此我们需要创建一个结构体,用来存放初始数据。

结构体定义如下:

#define MAX 100
typedef int KeyType;
typedef struct{KeyType key;
}RecordType;
typedef struct{RecordType R[MAX+1];int length;
}OrderList;

示例数据

 

其中data[0]置为0,用来表示哨兵单元。

直接插入排序

基本思想

当插入第i个记录时,前面的R[1]....R[i-1]已经排好序,这时用R[i]依次与前面的关键字比较,直到找

到合适的位置,随后插入。

代码实现

OrderList InsertSort(OrderList L)	//直接插入排序 
{int i,j;for(i=2;i<=10;i++){L.R[0] = L.R[i];	//L[0]做哨兵单元,同时也用来存放当前i位置记录大小. j = i - 1;		//从i单元的前一个单元开始比较. while(L.R[0].key<L.R[j].key){		//升序 L.R[j+1] = L.R[j];		//记录依次后移,其中最前面的记录永远会存在连续的两个. j = j - 1;			//j需要前移继续比较. }L.R[j+1] = L.R[0];		//j+1为合适的位置. }return L;
}

验证

复杂度

时间复杂度为:O(_N{2})

空间复杂度一直为:O(1)

折半插入排序

基本思想

折半插入排序跟前面的折半查找有同曲异工之妙,其中在查找的时候不再是顺序查找,而是折半查

找,但是在数据移动的过程中,仍然是顺序移动下来。

代码实现

OrderList BinsertSort(OrderList L)		//折半插入排序 
{int i,j,low,high,mid;for(i=2;i<=L.length;i++){L.R[0] = L.R[i];low = 1;high = i - 1;		//上界应该为i单元的前一个单元位置 while(low <= high){		mid = (low+high) / 2;if(L.R[0].key < L.R[mid].key)high = mid - 1;elselow = mid + 1;}	//待插入的位置一定是low的位置, for(j=i-1;j>=low;j--)		//i单元前面的所有单元依次后移. L.R[j+1] = L.R[j];L.R[low] = L.R[0];		//插入单元 }return L;
}

验证

复杂度

若待排序列为正序,则时间复杂度为:O(N)

若待排序列为逆序,则时间复杂度为:O(_N{2})

空间复杂度一直为:O(1)

希尔排序

希尔排序又叫做“缩小增量排序”。

基本思想

先将整个记录序列分割成若干个子序列,分别进行直接插入排序,在整个序列中的记录“基本有序”

时,再对全体记录进行一次直接插入排序。

其中,子序列并不是进行简单的分割,而是将某个增量d的记录组成一个子序列,让增量d逐步缩

短,直到d=1为止。

d的选取有很多种方法,这里只简单说明最基本的一种(足以应对绝大多数情景):

d = [n/2]--------->d = [d/2]

下面我们给出一个例子:

假定有一个数据序列为:{5,9,12,2,8,15}

我们来看看希尔排序的一个完整过程:

1.d = [6/2] = 3

将整个序列分为三个子序列:{5,2}、{9,8}、{12,15}。

对三个子序列分别进行直接插入排序,得到新的三个子序列:

{2,5}、{8,9}、{12,15}

由这三个子序列拼凑成一个新的序列为:

{2,8,12,5,9,15}

2.d = [3/2] = 1

此时d = 1,所以直接对整个序列{2,8,12,5,9,15}进行一次直接插入排序,即可获得最终结果。

代码实现

OrderList ShellSort(OrderList L)
{int i,j,d;RecordType tmp;for(d=L.length/2;d>0;d/=2){		//d为本趟希尔排序的增量 for(i=d+1;i<=L.length;i++){tmp = L.R[i];		//保存待插入单元 j = i - d;		//j是与i间隔为d的前一个单元 while(j>=1&&tmp.key<L.R[j].key){	L.R[j+d] = L.R[j];		//R[j]必须后移d个位置,因为比较单元间相隔d j = j - d;}L.R[j+d] = tmp; }}return L;
}

验证

复杂度

时间复杂度为:O(^{N^{1.3}})

空间复杂度一直为:O(1)

所有代码

#include<stdio.h>
#define MAX 100
typedef int KeyType;
typedef struct{KeyType key;
}RecordType;
typedef struct{RecordType R[MAX+1];int length;
}OrderList;OrderList InsertSort(OrderList L)	//直接插入排序 
{int i,j;for(i=2;i<=10;i++){L.R[0] = L.R[i];	//L[0]做哨兵单元,同时也用来存放当前i位置记录大小. j = i - 1;		//从i单元的前一个单元开始比较. while(L.R[0].key<L.R[j].key){		//升序 L.R[j+1] = L.R[j];		//记录依次后移,其中最前面的记录永远会存在连续的两个. j = j - 1;			//j需要前移继续比较. }L.R[j+1] = L.R[0];		//j+1为合适的位置. }return L;
}OrderList BinsertSort(OrderList L)		//折半插入排序 
{int i,j,low,high,mid;for(i=2;i<=L.length;i++){L.R[0] = L.R[i];low = 1;high = i - 1;		//上界应该为i单元的前一个单元位置 while(low <= high){		mid = (low+high) / 2;if(L.R[0].key < L.R[mid].key)high = mid - 1;elselow = mid + 1;}	//待插入的位置一定是low的位置, for(j=i-1;j>=low;j--)		//i单元前面的所有单元依次后移. L.R[j+1] = L.R[j];L.R[low] = L.R[0];		//插入单元 }return L;
}OrderList ShellSort(OrderList L)
{int i,j,d;RecordType tmp;for(d=L.length/2;d>0;d/=2){		//d为本趟希尔排序的增量 for(i=d+1;i<=L.length;i++){tmp = L.R[i];		//保存待插入单元 j = i - d;		//j是与i间隔为d的前一个单元 while(j>=1&&tmp.key<L.R[j].key){	L.R[j+d] = L.R[j];		//R[j]必须后移d个位置,因为比较单元间相隔d j = j - d;}L.R[j+d] = tmp; }}return L;
}int main()
{OrderList sample;sample.length = 10;int i,data[11]={0,5,8,4,12,35,6,8,67,64,100};for(i=1;i<11;i++)sample.R[i].key = data[i];sample = ShellSort(sample);for(i=1;i<11;i++)printf("%d ",sample.R[i].key);return 0;
}

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

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

相关文章

012 C++ AVL_tree

前言 本文将会向你介绍AVL平衡二叉搜索树的实现 引入AVL树 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序普通的二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M…

学习模拟简明教程【Learning to simulate】

深度神经网络是一项令人惊叹的技术。 有了足够的标记数据&#xff0c;他们可以学习为图像和声音等高维输入生成非常准确的分类器。 近年来&#xff0c;机器学习社区已经能够成功解决诸如对象分类、图像中对象检测和图像分割等问题。 上述声明中的加黑字体警告是有足够的标记数…

OpenHarmony源码下载

OpenHarmony源码下载 现在的 OpenHarmony 4.0 源码已经有了&#xff0c;在 https://gitee.com/openharmony 地址中&#xff0c;描述了源码获取的方式&#xff0c;但那是基于 ubuntu 或者说是 Linux 的下载方式。在 windows 平台下的下载方式没有做出介绍。 我自己尝试了 wind…

PCIe协议加持,SD卡9.1规范达到媲美SSD的速度4GB/s

近日&#xff0c;SD协会&#xff08;SDA&#xff09;宣布了最新的SD Express存储卡的进化&#xff0c;将microSD Express存储卡的速度提高了一倍&#xff0c;达到2GB/s&#xff0c;并引入了4个新的SD Express速度等级&#xff0c;以确保新的SD 9.1规范中最低的顺序性能水平。这…

【Qt开发流程】之HelloWorld程序

【Qt开发流程】之HelloWorld程序 目的编写程序新建项目文件说明及界面设计 程序运行及发布程序运行程序发布手动构建使用windeployqt进行构建 设置应用程序图标修改快捷键类型列表命令行编译程序命令行编译.ui文件自定义类项目模式及项目文件介绍项目模式项目文件 目的 从Hell…

通过bat脚本控制Oracle服务启动停止

1、将Oracle服务全部设置为手动启动 初始安装Oracle之后服务启动状态&#xff1a; 2、服务功能介绍 3、构建服务启动/停止bat脚本 注意&#xff1a;编码选择ANSI(如果编码不是ANSI运行脚本会显示乱码) echo off :main cls echo 注&#xff1a;请保证该脚本是使用管理员权限…

Iceberg学习笔记(1)—— 基础知识

Iceberg是一个面向海量数据分析场景的开放表格式&#xff08;Table Format&#xff09;&#xff0c;其设计的目的是解决数据存储和计算引擎之间的适配的问题 表格式&#xff08;Table Format&#xff09;可以理解为元数据以及数据文件的一种组织方式&#xff0c;处于计算框架&…

Java —— 抽象类和接口

目录 1. 抽象类 1.1 抽象类概念 1.2 抽象类语法与特性 1.3 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口的语法规则与特性 2.3 实现多个接口(解决多继承的问题) 2.4 接口间的继承 2.5 抽象类和接口的区别 2.6 接口的使用实例 2.7 Clonable 接口和深拷贝 2.7.1 Cloneable接口 …

探索arkui(2)--- 布局(列表)--- 1(列表数据的展示)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中&#xff0c;开发人员通常会展示新网站或应用程序的设计、功能和用户体验&#xff0c;并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件&#xff0c;吸…

Apache Airflow (八) :DAG任务依赖设置

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

44、echarts图形自动轮播tooltip提示,并显示高亮

自动轮播方法 参数myChart代表echarts的实例名称, options指定图表的配置项和数据, num类目数量(原因&#xff1a;循环时达到最大值后&#xff0c;使其从头开始循环), time轮播间隔时长 //自动轮播显示高亮--tooltip提示 export function autoHover(myChart, option, num, ti…

【漏洞复现】IP-guard WebServer 远程命令执行

漏洞描述 IP-guard是一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。互联网上披露IP-guard WebServer远程命令执行漏洞情报。攻击者可利用该漏洞执行任意命令,获取服务器控制权限。 免责声明 技术文章仅供参考,任何个人和…

2024年软件测试面试必看系列,看完去面试你会感谢我的!!

朋友圈点赞的测试用例 功能测试 1点赞后是否显示结果 2.点赞后是否可以取消; 3.点赞取消后是否可以重复点赞; 4.共同好友点赞后&#xff0c;是否有消息提醒; 5.非共同好友点赞后&#xff0c;是否有消息提醒; 6.点击点赞人昵称&#xff0c;是否可以跳转到他/她的主页; 7.自己能…

Spring IOC/DI和MVC及若依对应介绍

文章目录 一、Spring IOC、DI注解1.介绍2.使用 二、Spring MVC注解1.介绍2.使用 一、Spring IOC、DI注解 1.介绍 什么是Spring IOC/DI&#xff1f; IOC(Inversion of Control&#xff1a;控制反转)是面向对象编程中的一种设计原则。其中最常见的方式叫做依赖注入&#xff08;…

【考研】数据结构(更新到顺序表)

线性表的定义和基本操作 学习目标 线性表定义&#xff1a;具有相同数据类型的n个数据元素的有序序列。 顺序表定义&#xff1a; 特点 基本操作 定义 静态&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//静态 typedef struct{int …

Sonar生成PDF错误Can‘t get Compute Engine task status.Retry..... HTTP error: 401

报错及修改&#xff1a; 报错&#xff1a;INFO: Can’t get Compute Engine task status.Retry… org.sonarqube.ws.connectors.ConnectionException: HTTP error: 401, msg: , query: org.apache.commons.httpclient.methods.GetMethod7a021f49 ERROR: Problem generating PD…

K8S基础笔记

1、namespace 名称空间用来对集群资源进行隔离划分&#xff0c;默认只隔离资源&#xff0c;不隔离网络k8s默认的名称空间为default 查看k8s的所有命名空间 kubectl get namespace 或者 kubectl get ns 创建名称空间 kubectl create ns 名称 或使用yaml方式 编写yamlkub…

Linux---(七)Makefile写进度条(三个版本)

文章目录 一、前提引入&#x1f397;️下面的代码什么现象&#xff1f;&#x1f397;️下面的代码什么现象&#xff1f; 二、缓冲区三、回车换行&#x1f397;️注意&#x1f397;️图解&#x1f397;️老式回车键造型&#xff08;意思是充当两个动作&#xff09;&#x1f397;…

【Python】给定n个十六进制正整数,输出它们对应的八进制数。

3.问题描述 给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。 样例输入 2 39 123ABC 样例输出 71 4435274 n int(input()) li [] # 创建列表 for i in range(n):li.append(input()) # 输入数据 for num in li:if len(num) < 100000: # 判断长度是否符…

Spring IOC - Bean的生命周期之依赖注入

在Spring启动流程中&#xff0c;创建的factoryBean是DefaultListableBeanFactory&#xff0c;其类图如下所示&#xff1a; 可以看到其直接父类是AbstractAutoireCapableBeanFactory&#xff0c;他主要负责完成Bean的自动装配和创建工作。 具体来说&#xff0c;AbstractAutowire…