【数据结构】排序(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://xiahunao.cn/news/2808921.html

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

相关文章

Canvas实现打砖块

一.预览 二.代码 <!DOCTYPE html> <html lang"en"> <head><title>打砖块</title><style>#myCanvas {background: #eee; /* 设置画布的背景颜色为浅灰色 */display: block;margin: 0 auto; /* 使画布在页面中居中显示 */}</s…

高原制氧机的工作原理以及对高原地区生活质量的积极影响

在广袤的高原地区&#xff0c;空气稀薄&#xff0c;氧气含量相对较低&#xff0c;给当地居民和外来游客带来了不小的困扰。然而&#xff0c;随着科技的飞速进步&#xff0c;高原制氧机应运而生&#xff0c;成为改善高原生活质量的重要利器。恒业通将探讨高原制氧机的工作原理、…

【算法与数据结构】463、LeetCode岛屿的周长

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;直接利用公式法&#xff0c;遇到一对相邻的陆地&#xff0c;总周长就减去2。那么周长公式为&#xff1…

微服务篇之任务调度

一、xxl-job的作用 1. 解决集群任务的重复执行问题。 2. cron表达式定义灵活。 3. 定时任务失败了&#xff0c;重试和统计。 4. 任务量大&#xff0c;分片执行。 二、xxl-job路由策略 1. FIRST&#xff08;第一个&#xff09;&#xff1a;固定选择第一个机器。 2. LAST&#x…

打包了一个QGIS3.34分享给大家

春节期间一时兴起编译打包了一个最新的QGIS版本QGIS3.34!秉承咱一贯理念&#xff0c;方便您使用也方便您不用&#xff01;该工具还是被打包为绿色版&#xff0c;即下即用&#xff0c;不用安装更无须卸载。微云的下载速度也比官方快很多&#xff0c;能大大节约您的时间提高您的工…

JavaAPI常用类02

目录 基本数据类型封装类 包装类常用属性方法 8中基本数据类型各自所对应的包装类 以下方法以java.lang.Integer为例 代码 运行 装箱和拆箱 装箱 何为装箱 代码 范围问题 代码 运行 拆箱 代码 String类 概述 代码 运行 创建形式 画图讲解 代码 运行 构造…

vscode使用restClient实现各种http请求

vscode使用restClient实现各种http请求 一&#xff0c;安装插件 首先&#xff0c;我们要在vscode的扩展中&#xff0c;搜索rest Client&#xff0c;然后安装它&#xff0c;这里我已经安装过了。 安装后&#xff0c;我们就可以使用rest client插件进行http各种操作了。 二&…

leetcode刷题-删除链表的倒数第N个节点(一次循环)

题目描述 解题思路 这几天玩的时间比较长&#xff0c;没有坚持更新。 解题思路很简单&#xff0c;也算是比较经典的问题。首先可以通道暴力解决&#xff0c;首先计算出来链表的长度&#xff0c;然后计算出来链表的长度&#xff0c;然后找到距离删除位置的前一个位置&#xff0…

131.乐理基础-快速识别音程(一)

上一个内容&#xff1a;130.乐理基础-倍增音程、倍减音程-CSDN博客 上一个内容里练习的答案&#xff1a; 开始不用数音数就可以辨别音程的方法&#xff0c;首先是不含升降号记号的两个音&#xff08;两个白键&#xff09;该怎样判断 方法的核心&#xff0c;就是音名中e-f和b-…

代码随想录算法训练营第28天 |第七章 回溯算法part04

学习目标&#xff1a; 93.复原IP地址 78.子集 90.子集II 学习内容&#xff1a; 93.复原IP地址 /class Solution { public:// string path;vector<string> result;bool isValid(const string& s, int start, int end) {if(start>end)return false;if(s[start]0&a…

SELF-RAG 论文详解

论文&#xff1a; https://arxiv.org/pdf/2310.11511.pdf code&#xff1a; https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_self_rag.ipynb?refblog.langchain.dev 相关工作 RAG 尽管 RAG 方法可以通过检索生成得到更为准确的结果&#xff0…

Codeforce Monsters Attack!(B题 前缀和)

题目描述&#xff1a; 思路&#xff1a; 本人第一次的想法是先杀血量低的第二次想法是先搞坐标近的第三次想法看到数据量这么大&#xff0c; 我先加个和看看貌似我先打谁都行&#xff0c;由此综合一下&#xff0c; 我们可以把每一个不同的坐标当作一轮从最小的坐标开始&#x…

老子云2024全站焕新,重塑3D轻量体验

3D模型当前应用广泛&#xff0c;正以惊人的速度实现数据增长&#xff0c;轻量化需求随之增多。老子云团队一直在探索如何借助自研轻量化技术的能力&#xff0c;打破用户模型处理思维惯性&#xff0c;构建更高效、实用、简单的体验范式&#xff0c;来帮助用户解决3D素材数据处理…

开源工具和框架

目录 开源工具和框架 一、 开源工具和框架 二、开源工具和框架在现代软件开发中的角色 1、基础设施建设&#xff1a; 2、开发效率提升&#xff1a; 3、代码质量保障&#xff1a; 4、技术创新&#xff1a; 三、广泛使用的开源项目分析 3.1、Linux 3.2、Git 3.3、Docke…

js设计模式:状态模式

作用: 将对象的行为和状态进行分离,状态是由行为操作决定的,而不是直接控制。 同时,行为也是由状态决定的,每个状态都有自己的行为和相应的方法 行为与状态分离,可以使代码方便维护 示例: <!DOCTYPE html> <html lang"en"><head><meta cha…

THE TRAVELING OBSERVER MODEL

FiLM (Perez et al., 2018) 作者未提供代码 参考文献 [1] E. Perez, F. Strub, H. de Vries, Vincent Dumoulin, and Aaron C. Courville. Film: Visual reasoning with a general conditioning layer. In Proc. of AAAI, 2018.

华为OD机试真题-万能字符单词拼写-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; str.repalce(old, new, 1); flag 代码&#xff1a; """ 题目分析&#xff1a; 没有掌握&#xff0c;输出为0 输入&#xff1a; words的个数&#xff0c; N int 每个字符串元素输出&#xff1a; 词汇表words中掌握的单…

软件实际应用实例,茶楼收银软件管理系统操作流程,茶室计时计费会员管理系统软件试用版教程

软件实际应用实例&#xff0c;茶楼收银软件管理系统操作流程&#xff0c;茶室计时计费会员管理系统软件试用版教程 一、前言 以下软件以 佳易王茶社计时计费管理系统软件V17.9为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、计时计费&…

SpringBoot:数据访问-整合 Druid 配置数据源监控

点击查看数据访问demo&#xff1a;LearnSpringBoot06DataJdbc 点击查看更多的SpringBoot教程 简介 Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池和监控。 一、添加druid-spring-boot-starter依赖 点击查询最新版 <dependency&g…

正版IDM多少钱?如何便宜购买序列号

IDM是一款互联网下载神器&#xff0c;它的全称是Internet Download Manager&#xff0c;可以将下载速度提升至5倍以上。那么IDM正版多少钱&#xff1f;如何才能买到正版IDM序列号呢&#xff1f; 正版IDM的价格根据付费模式和购买渠道不同&#xff0c;所需要的价格也是不同的。…