【非递归版】归并排序算法(2)

目录

MergeSortNonR归并排序

非递归&归并排序VS快速排序 

整体思想

图解分析​

代码实现

时间复杂度

归并排序在硬盘上的应用(外排序)


MergeSortNonR归并排序

前面的快速排序的非递归实现,我们借助栈实现。这里我们能否也借助栈去实现归并排序呢?

非递归&归并排序VS快速排序 

  • 快速排序的递归:前序递归
  • 快速排序的非递归:借用栈
  • 快速排序的非递归模拟递归借助栈,实际上来说,快排的非递归模拟回归的过程,就是不入栈。(实际上是没有这个回归过程的)
  • 因为快速排序回归不需要处理,在分割的时候就已经处理了

  • 归并排序的递归:后序递归
  • 归并排序的非递归:直接分解
  • 归并排序回归需要处理,然儿借助栈模拟非递归,根本没有回归这个过程。

  • 处理根  左  右(前序)
  • 左  右 根处理(后序)
  • 借助栈模拟非递归,比较适合前序,后序需要复杂处理是不适合的。

整体思想

  • 借助斐波那契数列的非递归思想
  • 递归的分治是倒着推;非递归的分治是正着推(顺着往前推)
  • 把整个序列直接看成分解之后的(不在去分解了)。直接合并。
  • 一一合并,二二合并,四四合并等等........(❗万一这个不是2的次方数合并呢❓)
  • 每小组合并之后拷贝回原数组(❗不要在每大组合并完再去拷贝❗)
  • 因为是一一合并,二二合并等等。设置一个gap变量控制每大组的合并

每小组

  • 设置begin1&end1&begin2&end2控制两个区间的序列的合并
  • 两段有序序列的合并
  • 拷贝 | 每小组合并之后拷贝回原数组(❗不要在每大组合并完再去拷贝❗)
  • ❗区间必须变化起来

每大组

  • 写入循环for
  • 完成每gap组的合并拷贝
  • 循环使❗区间必须变化起来

整体

  • gap变化起来
  • 结束条件:< n

易错点

  • 每小组合并完之后再去拷贝
  • 区间合并的起始位置&结束位置&拷贝的长度问题
  • 合并的组数不一定都是2的次方倍,越界问题。(可以尝试打印区间来查看越界问题)
  • 越界问题存在三种情况(begin1=i<n不会越界)
  1. end1(后面两个肯定越界,第一序列存在数,第二序列不存在数)
  2. begin2(end2肯定越界,第二序列不存在数)
  3. end2(可能第二序列区间还存在数)

图解分析​​​​​​​​​​​​​​ 

 

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>//0          n-1
void MergeSortNonR(int* a, int begin, int end, int* tmp)
{//直接看成分割完合并的int gap = 1;//整体while (gap < end + 1){//每组for (int i = 0; i < end + 1; i += 2 * gap){//每小组int begin1 = i;//不会越界int end1 = i + gap - 1;//会越界int begin2 = i + gap;int end2 = i + 2 * gap - 1;int j = i;//越界结束=n if (end1 >= end + 1 || begin2 >= end + 1){break;}//越界修改if (end2 >= end + 1)//=注意{end2 = end;}while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[j++] = a[begin1++];}else//>={tmp[j++] = a[begin2++];}}while (begin1 <= end1){tmp[j++] = a[begin1++];}while (begin2 <= end2){tmp[j++] = a[begin2++];}//begin1变了大哥memcpy(a + i, tmp + i, sizeof(int) * (end2-i+1));}printf("\n");gap = gap * 2;}
}int main()
{int a[] = { 10,6,7,1,3,9,4,2,9,8,7 };int n = sizeof(a) / sizeof(a[0]);int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}MergeSortNonR(a, 0, n - 1, tmp);PrintSort(a, n);free(tmp);return 0;
}

时间复杂度

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

归并排序在硬盘上的应用(外排序)

  • 内部排序:数据元素全部放在内存中的排序。
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。(硬盘)
  • 归并排序既是内排序,也是外排序。

  • 内存和硬盘的区别?
  • 为什么归并排序可以是外排序,其他排序只能是内排序?
  • 为什么数据要放到硬盘里面?
  • 大量的数据在文件中保存,如果用归并排序使其有序?

🙂感谢大家的阅读,若有错误和不足,欢迎指正。关于归并排序作为外排序在文件中的应用,后面的补充内容会详细讲解。

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

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

相关文章

2.5G/5G/10G高速率网络变压器(网络隔离变压器)产品介绍(1)

Hqst华轩盛(石门盈盛)电子导读&#xff1a;高速率/2.5G 的带POE插件&#xff08;DIP&#xff09;款千兆双口网络变压器2G54801DP特点 一 ﹑2.5G高速率网络变压器&#xff08;网络隔离变压器&#xff09;&#xff1a;2G54801DP外观与尺寸 2G54801DP这颗产品尺寸为&#xff1a;长…

设计模式浅析(九) ·模板方法模式

设计模式浅析(九) 模板方法模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 模板方法模式 概念 模板方法模式&#xff08;Template Method Pattern&#xff09;在Java中是…

HP笔记本电脑如何恢复出厂设置?这里提供几种方法

要恢复出厂设置Windows 11或10的HP笔记本电脑,你可以使用操作系统的标准方法。如果你运行的是早期版本,你可以使用HP提供的单独程序清除计算机并重新安装操作系统。 恢复出厂设置运行Windows 11的HP笔记本电脑​ 所有Windows 11计算机都有一个名为“重置此电脑”的功能,可…

Llama2模型的优化版本:Llama-2-Onnx

Llama2模型的优化版本&#xff1a;Llama-2-Onnx。 Llama-2-Onnx是Llama2模型的优化版本。Llama2模型由一堆解码器层组成。每个解码器层&#xff08;或变换器块&#xff09;由一个自注意层和一个前馈多层感知器构成。与经典的变换器相比&#xff0c;Llama模型在前馈层中使用了不…

uni-app原生api的promise化以解决异步等待问题分析

相信各位在进行uni-app开发的时候会遇到各种关于异步回调问题&#xff0c;例如要传code给后端以换取session_key&#xff0c;在这之前需要先调用 uni.login&#xff0c;所以执行的顺序是必须同步等待的。在写这篇文章之前对于整体的流程概念需要做一个梳理&#xff0c;以便能更…

普中51单片机学习(8*8LED点阵)

8*8LED点阵 实验代码 #include "reg52.h" #include "intrins.h"typedef unsigned int u16; typedef unsigned char u8; u8 lednum0x80;sbit SHCPP3^6; sbit SERP3^4; sbit STCPP3^5;void HC595SENDBYTE(u8 dat) {u8 a;SHCP1;STCP1;for(a0;a<8;a){SERd…

分布式事务之2、3段提交协议

二阶段提交协议 二阶段提交(Two-phaseCommit)是在计算机网络以及数据库领域内&#xff0c;为了使分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。 在分布式系统中&#xff0c;每个节点虽然可以知晓自己的操作是成功或者失败&#xff0c;却无法知道其…

项目登录方案选型

一.Cookie + Session 登录 大家都知道,HTTP 是一种无状态的协议。无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求返回数据,但不会记录任何信息。为了解决 HTTP 无状态的问题,出现了 Cookie。Co…

[嵌入式系统-33]:RT-Thread -18- 新手指南:三种不同的版本、三阶段学习路径

目录 前言&#xff1a;学习路径&#xff1a;入门学习-》进阶段学习》应用开发 一、RT-Thread版本 1.1 标准版 1.2 Nano 1.3 Smart版本 1.4 初学者制定学习路线 1.5 RT-Thread在线文档中心目录结构 1.6 学习和使用RT-Thread的三种场景 二、入门学习阶段&#xff1a;内…

面试redis篇-08数据淘汰策略

原理 当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。 Redis支持8种不同策略来选择要删除的key: noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是…

BTC网络 vs ETH网络

设计理念 BTC 网络 比特币是一种数字货币&#xff0c;旨在作为一种去中心化的、不受政府或金融机构控制的电子货币。其主要目标是实现安全的价值传输和储存&#xff0c;比特币的设计强调去中心化和抗审查。 ETH 网络 以太坊是一个智能合约平台&#xff0c;旨在支持分散的应…

thinkphp6定时任务

这里主要是教没有用过定时任务没有头绪的朋友, 定时任务可以处理一些定时备份数据库等一系列操作, 具体根据自己的业务逻辑进行更改 直接上代码 首先, 是先在 tp 中的 command 方法中声明, 如果没有就自己新建一个, 代码如下 然后就是写你的业务逻辑 执行定时任务 方法写好了…

Laravel03 路由到控制器与连接数据库

Laravel03 路由到控制器与连接数据库 1. 路由到控制器2. 连接数据库 1. 路由到控制器 如下图一些简单的逻辑处理可以放在web.php中&#xff0c;也就是路由的闭包函数里面。但是大的项目&#xff0c;我们肯定不能这么写。 为什么保证业务清晰好管理&#xff0c;都应该吧业务逻辑…

IP 电话

1 IP 电话概述 IP 电话是在互联网上传送多媒体信息。 多个英文同义词&#xff1a; VoIP (Voice over IP) Internet Telephony VON (Voice On the Net) 1.1 狭义的和广义的 IP 电话 狭义的 IP 电话&#xff1a;指在 IP 网络上打电话。 广义的 IP 电话&#xff1a;不仅仅是…

在Pycharm中运行Django项目如何指定运行的端口

方法步骤&#xff1a; 打开 PyCharm&#xff0c;选择你的 Django 项目。在菜单栏中&#xff0c;选择 “Run” -> “Edit Configurations...”。在打开的 “Run/Debug Configurations” 对话框中&#xff0c;选择你的 Django server 配置&#xff08;如果没有&#xff0c;你…

力扣链表篇

以下刷题思路来自代码随想录以及官方题解 文章目录 203.移除链表元素707.设计链表206.反转链表24.两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 203.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链…

pytorch -- torch.nn下的常用损失函数

1.基础 loss function损失函数&#xff1a;预测输出与实际输出 差距 越小越好 - 计算实际输出和目标之间的差距 - 为我们更新输出提供依据&#xff08;反向传播&#xff09; 1. L1 torch.nn.L1Loss(size_averageNone, reduceNone, reduction‘mean’) 2. 平方差&#xff08;…

openai.CLIP多模态模型简介

介绍 OpenAI CLIP&#xff08;Contrastive Language–Image Pretraining&#xff09;是一种由OpenAI开发的多模态学习模型。它能够同时理解图像和文本&#xff0c;并在两者之间建立联系&#xff0c;实现了图像和文本之间的跨模态理解。 如何工作 CLIP模型的工作原理是将来自…

npm install 失败,需要node 切换到 对应版本号

npm install 失败 原本node 的版本号是16.9&#xff0c;就会报以上错误 node版本问题了&#xff0c;我切到这个版本&#xff0c;报同样的错。降一下node&#xff08;14.18&#xff09;版本就好了 具体的方法&#xff1a;&#xff08;需要在项目根目录下切换&#xff09; 1. …

Linux使用Docker部署在线协作白板WBO并结合内网穿透发布公网远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…