排序(插入,希尔,堆排)

常见的排序算法:
在这里插入图片描述

插入排序:
直接插入排序:是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。保证插入之前的数组是有序的,插入后也保证是有序的。时间复杂度:原数组如果和需要排的顺序逆序的时候是最坏的情况,O(N^2),和冒泡排序时间复杂度相同。最好的情况是O(N),顺序有序。

// 直接插入插入排序
void InsertSort(int* a, int n)
{//多趟排序for(int i = 0; i < n-1; ++i) // 当n = n-2时,插入的就是第n-1的位置的值,就完成了n个数的插入。{// 单趟排序 把tmp插入数组[0,end]的有序区间int end = i; // 从后往前判断,end 就是当前判断的最后一个值int tmp = a[end + 1]; // end外面要插入的数据while(end >= 0) // 从后往前,end--{if(tmp < a[end]){a[end + 1] = a[end]; //让end位置的值放在end+1的位置end--; }elsebreak; // 说明tmp >= a[end-1]}a[end + 1] = tmp; // 需要在end-1的后面 也就是end+1的位置存放tmp}
} 

希尔排序:再插入排序的基础上,让数组首先接近于有序。也就是1.预排序 ->让数组接近有序,2.直接插入排序。
预排序 ->先分组,对分组的数据进行插入排序。间隔为gap的分成一组,对一组进行插入排序。
蓝色的整体为一组,红色的整体为一组,绿色的整体为一组。每次比较的时候只比较各自颜色指向的数字,以蓝色为例,也就是9,5,8,5相比较后进行排序。
gap越大,说明大的数和小的数可以更快的挪到对应的位置,但gap越大越不接近有序。gap越小则相反。
如果gap==1,则就是直接插入排序。排序的规则就是gap = 5, gap = 3, gap = 1来三次就完成希尔排序。
希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N^1.3和 N^2)
在这里插入图片描述

 // 希尔排序
void ShellSort(int* a, int n)
{int gap = n;// gap>1是预排序让它接近有序,gap == 1,就是直接插入排序O(N)。while(gap > 1){gap = (gap / 3 + 1); //这样可以保证gap最后一次是1。// i<n-gap 则对应上图的话就到蓝色8这个位置,i一直加到这个位置可以把蓝色红色和绿色全部处理完。// 也就是 先蓝色,再红色,再绿色,再蓝色,再红色,再绿色,再蓝色(8这个位置)就完了。因为后面红色绿色只有一个数。for(int i = 0; i < n-gap; ++i) {int end = i;int tmp = a[end + gap]; //要插入的值while(end >= 0) // 间隔为gap的排序,类似于直接插入排序(间隔为1){if(tmp < a[end]){a[end + gap] = a[end];end -= gap;}elsebreak;}a[end + gap] = tmp;}}
}

直接选择排序:在数组中直接选择最大的,次大的放到相应位置直接排。

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
// 选择排序
void SelectSort(int* a, int n)
{// 将最小的放在最左边,最大的放在最右边,让左右位置往中间夹int left = 0;int right = n-1;while(left < right){int minIndex = left, maxIndex = left;for(int i=left; i<right; ++i){if(a[i] < a[minIndex]) // 选出最小的minIndex = i;if(a[i] > a[maxIndex]) //选出最大的maxIndex = i;}Swap(&a[left], &a[minIndex]); //如果最大值在left位置,上面交换后max就被换走了 换到minIndex的位置去了 修正位置。if(left == maxIndex) {maxIndex = minIndex;}Swap(&a[right], &a[maxIndex]);++left;--right;}
}

堆排序:先得有个堆然后再选择出放到特定位置的选择排序方法。
堆排序的详细介绍

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}// 堆排序 //自顶向下的调整,但是parent的传参是自下而上的传,先保证最下面的parent及其子节点属于大堆,再一层一层的向上传parent。
void AdjustDwon(int* a, int n, int parent)
{int child = parent*2 + 1;while(child < n){// 建大堆 选出左右孩子大的if(child + 1 < n && a[child + 1] > a[child]){child++;}if(a[parent] < a[child]){Swap(&a[parent], &a[child]);parent = child;child = parent*2 + 1;}elsebreak;}
}
void HeapSort(int* a, int n)
{// 建堆 parent的传参是自下而上的传,先保证最下面的parent及其子节点属于大堆,再一层一层的向上传parent。for(int i = (n-1-1)/2; i >=0; --i){AdjustDwon(a, n, i);}int end = n-1;while(end > 0){Swap(&a[0], &a[end]);// 再选出次大的 因为之前已经建堆完成了,因此只有换上去到最上面的那个数不满足大堆的排序,把它排好就行AdjustDwon(a, end, 0)end--; //每次最后一个位置就是被调换过的最大的、次大的...的数}
}

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

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

相关文章

mysql如何替换数据库所有表中某些字段含有的特定值

目录 背景查询所有表名查询表的所有字段过虑特征字段替换字段中含有的特定值 背景 公司的测试域名更换了&#xff0c;导致存放在数据库中的域名也要跟着替换&#xff0c;当然把域名存放在数据库表中是不科学的&#xff0c;不建议这样做&#xff0c;但公司的同事就这样做了&…

AWS开启MFA,提高安全性

引言 多因素认证&#xff08;Multi-Factor Authentication, MFA&#xff09;是一种重要的安全措施&#xff0c;可以显著提高您的AWS账号的安全性。通过启用MFA&#xff0c;即使密码被盗&#xff0c;攻击者也难以访问您的账户。本文中九河云将详细介绍如何在AWS Management Con…

element-plus表格操作

elememt-plus安装见上文 表格的特性 element-plus中的表格和原版表格最大的不同是写法不同&#xff0c;原版表格以行的方式写&#xff0c;element-plus以列的方式写。 element-plus的表格可以更方便的展示数据&#xff0c;只需要考虑数据的格式即可。 表格标签 表格标签有两种…

LeetCode 257. 二叉树的所有路径,dfs

LeetCode 257. 二叉树的所有路径 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 目录 LeetCode 257. 二叉树的所有路径算法选择数据结构解题步骤算法流程算法代码算法分析易错点和注意事项相似题目 算法选择 深度优…

Web端云剪辑解决方案,提供多轨视频、音频、特效、字幕轨道可视化编辑

传统视频剪辑软件的繁琐安装、高昂硬件要求以及跨平台协作的局限性&#xff0c;让无数创意者望而却步。美摄科技作为云端视频编辑技术的领航者&#xff0c;携其革命性的Web端云剪辑解决方案&#xff0c;正重新定义视频创作的边界&#xff0c;让专业级视频剪辑触手可及&#xff…

k8s StorageClass 存储类

文章目录 一、概述1、StorageClass 对象定义2、StorageClass YAML 示例 二、StorageClass 字段1、provisioner&#xff08;存储制备器&#xff09;1.1、内置制备器1.2、第三方制备器 2、reclaimPolicy&#xff08;回收策略&#xff09;3、allowVolumeExpansion&#xff08;允许…

多线程:死锁

目录 死锁的条件 死锁的示例 死锁的预防与解决 死锁的检测 总结 死锁&#xff08;Deadlock&#xff09;是多线程或多进程环境中一种特定的状态&#xff0c;指的是两个或多个线程或进程在执行过程中&#xff0c;由于争夺资源而造成的一种相互等待的状态&#xff0c;导致它们…

Linux usb主机控制器HC阅读

intel的UHCI 一种usb主机控制器的接口规范,遵守它的硬件称为UHCI主机控制器,Linux中,把这种硬件叫做HC,host controller,与之对应的软件,叫做HCD,hc driver, depends on usb & pci: 它的内核软件模块代码是uhci-hcd.c uhci_hcd_init初始化开始: usb_disable函数:…

【openwrt】 libubox组件——ustream

文章目录 ustream 核心数据结构struct ustreamstruct ustream_buf_liststruct ustream_bufstruct ustream_fd ustream 核心APIustream_fd_initustream_uloop_cbustream_fd_read_pendingustream_fill_read ustream_write_pendingustream_writeustream_fd_write ustream 应用示例…

前端开发必须了解的css知识

文本过长省略显示 单行 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }多行 方法一&#xff1a; .ellipsis {overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp: 3;word-break: break-all; }方法二&#xff1a; .ellipsis {ove…

文献笔记 - Neural Lander: Stable Drone Landing ControlUsing Learned Dynamics

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者&#xff0c;文献的引用格式如下&#xff0c;原文更有价值 [1]Guanya Shi∗,Xichen Shi∗,Michael OConnell∗,et al.Neural La…

LOGO设计新革命:5款AI工具让你秒变设计大师(必藏)

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 你是否曾因设计一个既独特又专业的LOGO而感…

Tableau|二 如何利用功能区创建视图

一 认识 Tableau 数据 1.数据角色 维度和度量是Tableau的一种数据角色划分&#xff0c;离散和连续是另一种划分方式。 1.维度和度量 维度往往是一些分类、时间方面的定性字段&#xff0c;将其拖放到功能区时&#xff0c;Tableau不会对其进行计算&#xff0c;而是对视图区进行分…

Swin Transformer(ICCV 2021 best paper):基于卷积层级式架构的移动窗口视觉Transformer!

有关ViT的学习笔记详见&#xff1a;学习笔记——ViT(Vision Transformer)-CSDN博客 ViT在图像分类方面的结果令人鼓舞&#xff0c;但由于其低分辨率的特征映射和复杂度随图像大小的二次方增长&#xff0c;其架构不适合作为密集视觉任务或高分辨率输入图像的backbone。根据经验&…

JetBrains系列产品无限重置免费试用方法

JetBrains系列产品无限重置免费试用方法 写在前面安装插件市场安装插件 写在前面 支持的产品&#xff1a; IntelliJ IDEA AppCode CLion DataGrip GoLand PhpStorm PyCharm Rider RubyMine WebStorm为了保证无限重置免费试用方法的稳定性&#xff0c;推荐下载安装2021.2.2及其…

OpenAI GPT-3 API error: “This model‘s maximum context length is 2049 tokens“

题意&#xff1a;OpenAI GPT-3 API 错误&#xff1a;“此模型的最大上下文长度是 2049 个token” 问题背景&#xff1a; I have two issues relating to the response result from OpenAI completion. 我遇到了两个与OpenAI完成响应结果相关的问题 The following result does…

Sam Altman的博客:The Intelligence Age

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

《深入解析:水果销售数据库操作与查询技巧》

文章目录 一、数据库结构与数据源插入1.1 创建数据库与表1.2 插入数据 二、基础数据查询2.1 查询客户信息2.2 查询供应商信息 三、查询优化与技巧3.1 使用LIMIT子句 四、高级查询技巧4.1 使用聚合函数4.2 连接查询4.3 使用子查询 五、案例分析5.1 客户订单详情查询 一、数据库结…

无法将“allure”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方法-allure的安装配置全过程

新手在使用allure之前&#xff0c;以为只是pip install allure-pytest就可以&#xff0c;no&#xff01;&#xff01;&#xff01; 其实&#xff0c;还需要下载allure&#xff0c;allure的具体步骤如下&#xff1a; 1.下载 allure。 allure的下载地址&#xff1a;Central Re…

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例 一、华为云Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点 二、1Panel介绍2.1 1Panel 简介2.2 1Panel 特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、购…