【排序,直接插入排序 折半插入排序 希尔插入排序】

文章目录

  • 排序
    • 排序方法的分类
    • 插入排序
      • 直接插入排序
      • 折半插入排序
      • 希尔插入排序

排序

将一组杂乱无章的数据按照一定规律排列起来。将无序序列排成一个有序序列。

排序方法的分类

储存介质:

  • 内部排序:数据量不大,数据在内存,无需内外存交换数据。
  • 外部排序:数据量较大,数据在外存(文件排序)。

比较器个数:

  • 串行排序:单处理机(同一时刻比较一对元素)。
  • 并行排序:多处理机(同一时刻比较多对元素)。

主要操作:

  • 比较排序:用比较的方法。
    插入排序,交换排序,选择排序,归并排序
  • 基数排序:不比较元素的大小,仅仅根据元素本身的取值确定其有序位置。

辅助空间:

  • 原地排序:辅助空间用量为O(1)的排序方法。
  • 非原地排序:辅助空间用量超过O(1)的排序方法。

稳定

  • 稳定排序
  • 非稳定排序

插入排序

直接插入排序

前提是数组中的元素是有序的。
在这里插入图片描述

#include<stdio.h>void PrintArr(int arr[],int l);
void InsertSort(int arr[], int l);//#define MAXSIZE 20	//设记录的值不超过20个
//#define  KeyType int//设关键字为整型量
//#define InfoType int //定义InfoType的其他数据项
//
//
//typedef struct {
//	KeyType key;//定义每个记录(数据元素)的结构
//	InfoType otherinfo;//其他数据项
//}RedType;
//
//typedef struct SqList {
//	RedType r[MAXSIZE + 1];//存储顺序表的结构
//						//r[0]一般做哨兵或者缓冲区
//	int length;//顺序表的长度
//}SqList;
//
//void InsertSort(SqList S) {
//	int i, j;
//	for (i = 2; i < S.length; i++) {
//		if (arr[i]  < arr[i - 1] ) {
//			arr[i]  = arr[0] ;
//		
//		for (j = i - 1; arr[j]  > arr[0] ; j--) {
//			arr[j + 1] = arr[j];//j的值都要依次向后移,进行插入
//		}
//		arr[j+1]  = arr[0] ;//这里直接将哨兵的值赋值给当前查出来正确的位置
//		}
//	}
//}void InsertSort(int arr[], int l) {int i = 0, j;int temp;printf("请输入要插入的数:");scanf_s("%d", &temp);arr[i] = temp;for (i = 2; i < l; i++) {if (arr[i] < arr[i - 1]) {arr[i]  = arr[0] ;for (j = i - 1; arr[j]  > arr[0] ; j--) {arr[j + 1] = arr[j];//j的值都要依次向后移,进行插入}arr[j+1]  = arr[0] ;//这里直接将哨兵的值赋值给当前查出来正确的位置}}PrintArr(arr, l);
}void PrintArr(int arr[],int l) {int i;for (i = 1; i <= l; i++) {printf("%d ", arr[i]);}
}int main() {int arr[10] = { 1,2,3,4,5,6,7,14, 12};InsertSort(arr,10);return 0;
}

折半插入排序

查找插入位置时采用折半查找法。
在这里插入图片描述

void BInsert(SqList &S) {int i, j,low,high,mid;for (int i = 2; i <= S.length; i++) {if (S.r[i].key < S.r[i - 1].key) {S.r[i] = S.r[0];low = 1, high = i - 1;while (low <= high) {mid = (low + high) / 2;if (S.r[0].key <S.r[mid].key) {high = mid - 1;}else {high = mid + 1;}}for (j = i - 1; j < high + 1; j--) {S.r[j - 1] = S.r[j];S.r[high + 1] = S.r[0];}}}
}

折半插入排序—算法分析

  • 折半查找比顺序查找要快,所以折半插入排序就平均性能来说比直接插入排序要快;
  • 他所需要的关键码比较次数与待排序对象序列排列无关,仅依赖于对象个数,在插入第i个对象时,需要经过在这里插入图片描述次关键码比较,才能确定它应该插入的位置。
  • 折半查找减少了比较次数,但没有减少移动次数。
  • 平均性能优于直接插入排序。
  • 时间复杂度为O(n的平方)。
  • 空间复杂度为O(1)。
  • 是一种稳定的排序方法。

希尔插入排序

在这里插入图片描述

希尔排序的特点:

  1. 一次移动,移动位置较大,跳跃式地接近排序后的最终位置。
  2. 最后一次只需少量移动
  3. 增量序列必须是递减的,最后一个必须是1.
  4. 增量序列应该是互质的。
//希尔排序
void ShellInsert(SqList& L, int dk) {//对顺序表L进行一趟增量为dk的Shell排序,dk为增长因子int i,j;for (i = dk + 1; i <= L.length; ++i) {if (L.r[i].key < L.r[i - dk].key) {L.r[0] = L.r[i];for (j = i - dk; j > 0 && (L.r[0].key < L.r[j].key); j = j - dk) {L.r[j - dk] = L.r[j];}L.r[j + dk] = L.r[0];			}}
}void ShellSort(SqList& L, int dlta[], int t) {//按增量序列dlta[0..t-1]对顺序表L进行希尔排序for (int k = 0; k < t; k++) {ShellInsert(L, dlta[k]);//一趟增量为dlta[k]的插入排序}
}

希尔排序算法分析
在这里插入图片描述

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

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

相关文章

PHP在线日语学习平台

有需要请加文章底部Q哦 可远程调试 PHP在线日语学习平台 一 介绍 此日语学习平台基于原生PHP开发&#xff0c;数据库mysql。系统角色分为用户和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/注销 2 个人中心 3 查看课程…

首次部署Linux系统的经历

我是一名电子信息工程专业的学生&#xff0c;有次在图书馆上自习的时候无意间看到其他同学的电脑屏幕&#xff0c;黑色的屏幕上显示着一行一行的代码&#xff0c;勾起了我无限的好奇&#xff0c;经过询问得知他是用的Linux操作系统&#xff0c;是和Windows完全不同的系统&#…

记RocketMQ本地开发环境搭建始末

前言 最近工作中涉及到了RocketMQ的应用&#xff0c;为方便开发决定本地搭建一套RocketMQ的使用环境。 果然实践是个好东西... VMware虚拟环境搭建 这个网上有很多教程&#xff0c;只会比我写的详细有条理&#xff0c;这里就不在赘述了。 虚拟机搭建好之后每次重启电脑都无…

智能优化算法应用:基于风驱动算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于风驱动算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于风驱动算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.风驱动算法4.实验参数设定5.算法结果6.参考文献7.…

vue3实现element table缓存滚动条

背景 对于后台管理系统&#xff0c;数据的展示形式大多都是通过表格&#xff0c;常常会出现的一种场景&#xff0c;从表格跳到二级页面&#xff0c;再返回上一页时&#xff0c;需要缓存当前的页码和滚动条的位置&#xff0c;以为使用keep-alive就能实现这两种诉求&#xff0c;…

threeJs引入模型使用3D模型(vite+React+Ts)

要在 Three.js 中使用 3D 模型&#xff0c;你需要加载模型文件并将其添加到场景中。Three.js 支持多种不同的模型格式&#xff0c;比如 OBJ、FBX、GLTF 等。 init vitelatest //创建一个vite的脚手架 选择react并配置Ts 安装three.js准备 npm install react-three/drei np…

阿里云新版公共实例从注册账号到创建设备生成参数教程

1 注册阿里云 打开阿里云官网&#xff0c;点击右上角的登录/注册 打开的界面按照图片输入手机号注册 注册成功后&#xff0c;登录返回第一次打开的界面&#xff0c;点击控制台 点击控制台后界面如下 点击左上角的菜单&#xff0c;弹出新窗口&#xff0c;搜索物联网平台 开通物…

Wireshark之Intro, HTTP, DNS

源码地址&#x1f447; moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES: 《计算机网络&#xff0d;自顶向下方法(原书第6版)》编程作业&#xff0c;Wireshark实验文档的翻译和解答。 (github.com) 目录 &#x1f33c;Introduce &#x1f3a7;前置 &#x1f3a7;过…

MySQL之 InnoDB逻辑存储结构

InnoDB逻辑存储结构 InnoDB将所有数据都存放在表空间中&#xff0c;表空间又由段&#xff08;segment&#xff09;、区&#xff08;extent&#xff09;、页&#xff08;page&#xff09;组成。InnoDB存储引擎的逻辑存储结构大致如下图。下面我们就一个个来看看。 页&#xff08…

数据结构-二叉树(1)

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 1.有一个特殊的结点&…

Electronica慕尼黑电子展 Samtec团队与21ic分享虎家产品与方案

【摘要/前言】 “希望但凡是能够使用到连接器的场合都有Samtec的身影” 在慕尼黑上海电子展现场&#xff0c;Samtec华东区销售经理章桢彦先生在与21ic副主编刘岩轩老师的采访中&#xff0c;如是说道。这是一种愿景&#xff0c;更是Samtec的努力方向。短短一句话&#xff0c;…

自定义 element DatePicker组件指令 使选择器呈现为只读状态,用户无法直接编辑,但可以查看和选择日期

1.问题 现实中遇到列表的搜索条件使用DatePicker 组件进行开始结束时间筛选&#xff0c;但是手动修改input中的值&#xff0c;导致请求参数异常。比如讲clearable设置为false之后还是能手动清空输入框中的值。虽然组件提供了readonly 属性&#xff0c;但是也会让日期选择也无法…

详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制&#xff08;擦除机制&#xff09; 六.泛型的上界 一.什么是泛型 泛型&#xff08;Generics&#xff09;是Java SE 5中引入的一个新特性&#xff0c;可以使Java中的类和方…

Unity安装

DAY1 下载Unity 打开Unity3D官网&#xff0c;下载Unity Hub&#xff0c;管理Unity的软件。链接https://unity.cn/releases (可能需要注册账号&#xff0c;就正常注册登录即可) 如果是新版的hub&#xff0c;可能长下面这个样子&#xff0c;还是英文的&#xff0c;点击圆圈的设…

maven 将Jar包安装到本地仓库

window系统&#xff1a; 注意事项&#xff1a;在windows中&#xff0c;使用mvn指令将jar安装到本地仓库时&#xff0c;一定要将相关资源使用“"”包裹上&#xff0c;不然会报下面的错&#xff1a; mvn install:install-file "-DfileD:\BaiduNetdiskDownload\qianzixi…

内网穿透的应用-Jupyter Notbook+cpolar内网穿透实现公共互联网访问使用数据分析工作

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

[C++]六大默认成员函数详解

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C和Linux &#x1f33c;博客专栏&#xff1a;C入门 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&#x1f3fb; …

Java项目学生管理系统二查询所有

学生管理 近年来&#xff0c;Java作为一门广泛应用于后端开发的编程语言&#xff0c;具备了广泛的应用领域和丰富的开发资源。在前几天的博客中&#xff0c;我们探讨了如何搭建前后端环境&#xff0c;为接下来的开发工作打下了坚实的基础。今天&#xff0c;我们将进一步扩展我…

Git分支批量清理利器:自定义命令行插件实战

说在前面 不知道大家平时工作的时候会不会需要经常新建git分支来开发新需求呢&#xff1f;在我这边工作的时候&#xff0c;需求都是以issue的形式来进行开发&#xff0c;每个issue新建一个关联的分支来进行开发&#xff0c;这样可以通过issue看到一个需求完整的开发记录&#x…

C语言练习记录(蓝桥杯练习)(小蓝数点)

目录 小蓝数点 第一题程序的输出结果是&#xff1f;: 第二题下面代码的执行结果是什么&#xff1f;: 第三题下面代码的执行结果是什么&#xff1f;: 第四题关于关系操作符说法错误的是&#xff1f;: 第五题对于下面代码段&#xff0c;y的值为&#xff1f; 第六题sum 21 …