【数据结构】排序(1)

目录

一、概念:

二、直接插入排序:

三、希尔排序:

四、直接选择排序:

五、堆排序:

六、冒泡排序:


一、概念:

排序的概念:

        使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

排序又分为内部排序和外部排序:

内部排序:数据元素全部放在内存中的排序。

外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

常见的排序算法:

二、直接插入排序:

基本思想

待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

例如在我们玩扑克牌斗地主时的码牌操作中就运用到了这个思想。

代码实现:

当插入第i(i>=1)个元素时,前面的a[0],a[1],…,a[i-1]已经排好序,此时用a[i]的排序码与 a[i-1],a[i-2],…的排序码顺序进行比较,找到插入位置即将a[i]插入,原来位置上的元素顺序后移即可。

//时间复杂度: O(N^2)	逆序
//最好的情况: O(N)	顺序有序
void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++)// i小于n-1是为下面条件做铺垫,防止越界{// 设置end为下标,将其与tmp下标位置的数进行比较,并不断更新endint end = i;int tmp = a[end + 1];// 在单趟排序中,tmp固定// 设置数组最小数的条件while (end >= 0){// 对tmp和end位置数进行比较if (tmp < a[end]) {// 将end位置数复制在end+1处,本质上是更新去排序后对应的位置a[end + 1] = a[end];end--;// 更新end}else{break;}}// 将tmp数放入对应的位置a[end + 1] = tmp;}
}

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法 
  4. 稳定性:稳定

三、希尔排序:

又称缩小增量排序 

基本思想:

先选定一个整数gap,把待排序文件中所有记录分成gap个组,所有距离为gap的记录分在同一组内,并对每一组内的元素进行排序。

gap越大,大的值更快调到后面,小的值可以更快的调到前面,越不接近有序。

gap越小,跳的越慢,但是越接近有序,如果gap == 1,就是直接插入排序。

代码实现:

void ShellSort(int* a, int Size)
{int gap = Size;// gap > 1时是预排序,目的让他接近有序// gap == 1是直接插入排序,目的是让他有序while (gap > 1){gap = gap / 3 + 1;//保证最后一次gap是1,就是直接插入排序,但是数列已经非常接近有序了//gap代表的是有多少组// 这里就跟直接插入排序的模板一样for (int i = 0; i < Size - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。

  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,就是直接插入排序。

  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多。

  4. 时间复杂度(平均):O(N^1.3)

  5. 空间复杂度:O(1)

  6. 稳定性:不稳定。

四、直接选择排序:

基本思想:

每一次从待排序的数据元素中选出最小/最大的一个元素,存放在序列的起始/末尾位置,直到全部待排序的数据元素排完 。

代码实现:

  • 在元素集合a[i]--a[n-1]中选择关键码最大(小)的数据元素
  • 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换
  • 在剩余的a[i]--a[n-2](a[i+1]--a[n-1])集合中,重复上述步骤,直到集合剩余1个元素
// 时间复杂度: O(N^2)
// 最好的情况: O(N^2) 即使原本就有序,还是要暴力取数
// 空间复杂度: O(1)
void SelectSort(int* a, int Size)// 升序
{//设置下标int begin = 0;while (begin < Size){int min = begin;// 暴力选数for (int i = begin + 1; i < Size; i++){if (a[i] < a[min]){min = i;}}swap(a[begin], a[min]); //这里的swap使用的是库函数中写好了的,// 使用自己写的注意形参与实参begin++;}
}

直接选择排序的特性总结:

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

五、堆排序:

基本思想:

利用堆删除思想来进行排序使用向下调整。需要注意的是排升序要建大堆,排降序建小堆。

代码实现:

// 向下调整:升序建大堆
void AdjustDown(int* a, int size, int parent)
{int child = parent * 2 + 1;// 一层层的往下判别while (child < size){// 在保证不越界的前提下找出数大的子节点if (child + 1 < size && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){swap(a[child], a[parent]);// 这里的swap使用的是库函数中写好了的,// 使用自己写的注意形参与实参// 更新父,子节点parent = child;child = child * 2 + 1;}else{break;}}
}// 升序
void HeapSort(int* a, int Size)
{// O(N)// 要排升序,所以建大堆->找最后一个分叶节点向下调整,然后向前依次操作for (int i = (Size - 1 - 1) / 2; i >= 0; i--)// Size是个数,要下标所以-1,结合找最后一个分叶结点公式化简{AdjustDown(a, Size, i);}// O(N*logN)int end = Size - 1;while (end > 0){swap(a[0], a[end]);// 在向下调整使用end时,取的值是小于end,默认忽略最后一位,由前Size-1个数进行向下调整AdjustDown(a, end, 0);end--;}
}

堆排序的特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。

  2. 时间复杂度:O(N*logN)

  3. 空间复杂度:O(1)

  4. 稳定性:不稳定

六、冒泡排序:

基本思想:

       两两元素相比,前一个比后一个大就交换,直到将最大/最小(升序/降序)的元素交换到末尾位置。这为一趟;一共进行 n-1 趟这样的交换将可以把所有的元素排序好。

代码实现:

//时间复杂度: O(N^2)	乱序
//最好的情况: O(N)   有序
void BubbleSort(int* a, int Size)
{// n个数只需排 n - 1 躺即可for (int i = 0; i < Size - 1; i++){// 设置一个条件,判断一趟排序下来是否有位置交换bool exchange = false;for (int j = 1; j < Size - i; j++){if (a[j - 1] > a[j]){swap(a[j - 1], a[j]); // 这里的swap使用的是库函数中写好了的,// 使用自己写的注意形参与实参exchange = true;}}// 如果单趟下来并没有数交换位置则说明这个数列本就有序if (exchange = false){break;}}
}

冒泡排序的特性总结:

  1. 冒泡排序是一种非常容易理解的排序
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定 

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

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

相关文章

【Crypto | CTF】BUUCTF RSA2

天命&#xff1a;密码学越来越难了&#xff0c;看别人笔记都不知道写啥 天命&#xff1a;莫慌&#xff0c;虽然我不会推演法&#xff0c;但我可以用归纳法 虽然我不知道解题的推演&#xff0c;但我可以背公式啊哈哈哈 虽然我不会这题&#xff0c;但是我也能做出来 公式我不知…

百度百科词条在网络推广中的六大作用

也许很多网友都发现了&#xff0c;在网上查资料&#xff0c;百科词条往往是优先展示的。一方面因为百科是搜索引擎自身的平台&#xff0c;另一方面就是因为百科信息权威&#xff0c;网友认可度高。所以企业开展网络营销&#xff0c;百科营销是一块重要阵地。 也有的企业认为百科…

代码检测规范和git提交规范

摘要&#xff1a;之前开发的项目&#xff0c;代码检测和提交规范都是已经配置好的&#xff0c;最近自己新建的项目就记录下相关配置过程。 1. ESlint配置 2013年6月创建开源项目&#xff0c;提供一个插件化的JavaScript代码检测工具&#xff0c;创建项目是生成的eslintrc.js文…

Elasticsearch从入门到精通-01认识Elasticsearch

Elasticsearch从入门到精通-01认识Elasticsearch &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是程序员行走的鱼 &#x1f342;博主从本篇正式开始ES学习&#xff0c;希望小伙伴可以一起探讨 &#x1f4d6; 本篇主要介绍和大家一块简单认识下ES并了解ES中的主要角色…

装饰模式(Decorator Pattern)

定义 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许通过将对象包装在装饰器类的实例中来动态地添加新的行为和责任。这种模式可以在不修改现有代码的情况下&#xff0c;灵活地扩展对象的功能。 示例 考虑一个咖啡店的场景&…

springboot集成mqtt

文章目录 前言一、MQTT是什么&#xff1f;二、继承步骤1.安装MQTT2.创建项目&#xff0c;引入依赖3. 对应步骤2的代码3 测试 总结mqtt 启动后访问地址 前言 随着物联网的火热,MQTT的应用逐渐增多 曾经也有幸使用过mqtt,今天正好总结下MQTT的使用; 一、MQTT是什么&#xff1f;…

[OpenAI]继ChatGPT后发布的Sora模型原理与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

unity学习(28)——登录功能

有之前注册的知识&#xff0c;登录就很容易处理了。 登陆成功返回id&#xff1a; 登录失败返回null&#xff1a; 测试同一账号不能重复登陆&#xff01;登录成功后最好可以跳到新的场景中 结果是好的&#xff0c;去服务器看一下对应部分的代码&#xff0c;可见&#xff0c;登…

java面向对象上:类的结构之一

目录 1.相同点 2.不同点 2.1 在类中声明的位置的不同 2.2 关于权限修饰符的不同 2.3 默认初始化值的情况&#xff1a; 2.4 在内存中加载的位置 补充&#xff1a;回顾变量的分类&#xff1a; 方式一&#xff1a;按照数据类型&#xff1a; 方式二&#xff1a;按照在类中…

springboot211基于springboot医疗报销系统的设计与实现

医疗报销系统的设计与实现 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;报销单信息因为其管理内容繁杂&#xff0c;管理数量繁多…

备战蓝桥杯---基础算法刷题1

最近在忙学校官网上的题&#xff0c;就借此记录分享一下有价值的题&#xff1a; 1.注意枚举角度 如果我们就对于不同的k常规的枚举&#xff0c;复杂度直接炸了。 于是我们考虑换一个角度&#xff0c;我们不妨从1开始枚举因子&#xff0c;我们记录下他的倍数的个数sum个&#…

华为算法题 go语言或者ptython

1 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返…

【java面试系列】服务的限流

目录 一、常用的限流算法1.固定窗口计数器(计数器算法)2 滑动窗口计数器算法3. 漏桶算法4 令牌桶算法(`常用`)Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法二、 分布式限流1、网关层(Nginx、Openresty、Spring Cloud Gateway等)流量限制nginx限流Spring Cl…

C# CAD2016 cass10宗地Xdata数据写入

一、 查看cass10写入信息 C# Cad2016二次开发获取XData信息&#xff08;二&#xff09; 一共有81条数据 XData value: QHDM XData value: 121321 XData value: SOUTH XData value: 300000 XData value: 141121JC10720 XData value: 权利人 XData value: 0702 XData value: YB…

【算法与数据结构】200、695、LeetCode岛屿数量(深搜+广搜) 岛屿的最大面积

文章目录 一、200、岛屿数量1.1 深度优先搜索DFS1.2 广度优先搜索BFS 二、695、岛屿的最大面积2.1 深度优先搜索DFS2.2 广度优先搜索BFS 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、200、岛屿数量 1.1 深度优先搜…

1.CSS单位总结

CSS 单位总结 经典真题 px 和 em 的区别 CSS 中的哪些单位 首先&#xff0c;在 CSS 中&#xff0c;单位分为两大类&#xff0c;绝对长度单位和相对长度单位。 绝对长度单位 我们先来说这个&#xff0c;绝对长度单位最好理解&#xff0c;和我们现实生活中是一样的。在我们…

Django——ORM增删改查

基本对象 model.objects 创建数据 可以通过django编写的命令行方式快捷创建数据 python manage.py shell 如果对模型层有任何修改都需要重启shell&#xff0c;否则操作容易出错 在shell中我们需要先引入我们的模型&#xff0c;如from bookstore.models import Book 然后通过…

网络安全-nc(Netcat)工具详解

经常在反弹shell的时候使用nc命令&#xff0c;但是从来没有了解过&#xff0c;今天翻书看到了&#xff0c;准备记录一下。 nc全称Netcat&#xff0c;是TCP/IP连接的瑞士军刀。哈哈我最喜欢瑞士军刀了。 有一个比较偏的知识点&#xff0c;nc还可以探测目标的端口是否开放&…

个人博客系列-项目部署-nginx(3)

使用Nginx uwsgi进行部署django项目 一. 检查项目是否可以运行 启动项目 python manage.py runserver 0.0.0.0:8099输入ip:8099 查看启动页面 出现上述页面表示运行成功 二. 安装uwsgi并配置 2.1 下载uwsgi pip install uwsgi新建文件test.py写入内容&#xff0c;测试一…

Druid无法登录监控页面

问题表现&#xff1a;在配置和依赖都正确的情况下&#xff0c;无法通过配置的用户名密码登录Druid的监控页面 检查配置发现 配置的用户名和密码和请求中参数是一致的&#x1f914; Debug发现 ResourceServlet 是Druid的登录实现&#xff0c; 且调试发现usernameParam是null&am…