归并排序及其非递归实现

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

归并排序递归实现

归并排序非递归实现


归并排序递归实现

图示:

代码:

先分再归并,像是后序一般。

//归并排序
void MergeSort(int* arr, int left, int right)
{int* temp = (int*)malloc(sizeof(int) * (right));if (temp == NULL){perror("malloc fail");}_MergeSort(arr, temp, left, right - 1);free(temp);
}void _MergeSort(int* arr, int* temp, int left, int right)
{if (left >= right)return;int mid = (left + right) / 2;int begin1 = left;int begin2 = mid + 1;int end1 = mid;int end2 = right;_MergeSort(arr, temp, left, mid);_MergeSort(arr, temp, mid + 1, right);int index = left;while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2]){temp[index++] = arr[begin1++];}else{temp[index++] = arr[begin2++];}}while (begin1 <= end1){temp[index++] = arr[begin1++];}while (begin2 <= end2){temp[index++] = arr[begin2++];}memcpy(arr + left, temp + left, sizeof(int) * (right - left + 1));
}

归并排序非递归实现

这里的非递归实现不可借助栈实现,因为返回去的时候,不能使之有序。

代码:

//归并排序非递归
void MergeSortNonR(int* arr, int n)
{int* temp = (int*)malloc(sizeof(int) * n);if (temp == NULL){perror("malloc fail");}int gap = 1;while (gap < n){		for (int i = 0; i < n; i += 2 * gap){//归并的区间int begin1 = i;			int end1 = i + gap - 1;int begin2 = i + gap;int end2 = i + gap * 2 - 1;if (begin2 > n - 1){break;}if (end2 > n - 1){end2 = n - 1;}int index = i;//每次归并从i位置开始while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2]){temp[index++] = arr[begin1++];}else{temp[index++] = arr[begin2++];}}while (begin1 <= end1){temp[index++] = arr[begin1++];}while (begin2 <= end2){temp[index++] = arr[begin2++];}memcpy(arr + i, temp + i, sizeof(int) * (end2 - i + 1));}gap *= 2;}free(temp);
}

时间复杂度O(n*logn),空间复杂度O(N);

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

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

相关文章

如何开始着手一篇Meta分析 | Meta分析的流程及方法

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

管理经济学基本概念(五):一些基本术语

1、理性-行动者范式 使经济学家行动一致的东西就是采用理性-行动者范式来预判人的行为。简单地说&#xff0c;这个范式认为人们的行动式理性的、优化的和自利的。 2、税后净营业利润 税后经营净利润(NOPAT)是指将公司不包括利息收支的营业利润扣除实付所得税税金之后的数额加…

国庆10.01

TCPselect 代码 服务器 #include<myhead.h> #include<sqlite3.h> #define PORT 6666 //端口号 #define IP "192.168.0.104" //IP地址//键盘事件 int jp(fd_set tempfds,int maxfd) {char buf[128] ""; //用来接收数据char buf1[128] …

力扣:117. 填充每个节点的下一个右侧节点指针 II(Python3)

题目&#xff1a; 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。 初始状态下&#xff0c;所…

1、【开始】【简介】Qlib:量化平台

【简介】1、Qlib:量化平台 简介框架简介 Qlib是一个面向AI的量化投资平台,旨在实现AI技术在量化投资中的潜力,赋能研究,并创造价值。 通过Qlib,用户可以轻松利用他们的想法来创建更好的量化投资策略。 框架 在模块层,Qlib 是由上述组件组成的平台。这些组件被设计为低耦…

如何保持终身学习

文章目录 2.1. 了解你的大脑2.2 学习是对神经元网络的塑造2.3 大脑的一生 3.学习的心里基础3.1 固定思维与成长思维3.2 我们为什么要学习 4. 学习路径4.1 构建知识模块4.2 大脑是如何使用注意力的4.3 提高专注力4.4 放松一下&#xff0c;学的更好4.5 巩固你的学习痕迹4.6 被动学…

Vue3快速入门

简介 什么是Vue Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&…

newstarctf

wp web: 1.rce 可以发现这个变量名有下划线也有点。 $code$_POST[e_v.a.l]; 这时候如果直接按这个变量名来传参&#xff0c;php 是无法接收到这个值的&#xff0c;具体原因是 php 会自动把一些不合法的字符转化为下划线&#xff08;注&#xff1a;php8以下&#xff09;&am…

Vue.js3学习篇--Vue模板应用

目录 一,模板基础 1.模板插值 &#xff08;1&#xff09;基础插值 &#xff08;2&#xff09;HTML代码插值 &#xff08;3&#xff09;标签属性插值 2.模板指令 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;指令参数 二.条件渲染 1.使用v-if指令渲染 2.使…

16: KEil5的配置

目录 一:第一次使用 1:安装支持包--在线安装的方式 2:配置环境 3:文件的加入 4:文件夹的意义 A:Start B:Library C:User 二:官网固件库的下载 1:下载 2:Start文件夹下 A: 启动文件 B:外设寄存器和时钟文件 C: 内核寄存器 3:Library文件夹下 A:库文件 B:库函数的…

【单片机】15-AD和DA转换

1.AD转换及其相关背景知识 1.基本概念 1.什么是AD转换&#xff1f; A&#xff08;A&#xff0c;analog&#xff0c;模拟的&#xff0c;D&#xff0c;digital&#xff0c;数字的&#xff09; 现实世界是模拟的&#xff0c;连续分布的&#xff0c;无法被分成有限份&#xff1b;…

openGauss学习笔记-87 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用简单概述

文章目录 openGauss学习笔记-87 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用简单概述87.1 授予用户权限87.2 创建/删除MOT87.3 为MOT创建索引 openGauss学习笔记-87 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用简单概述 使用…

Vue2详解

Vue2 一、Vue快速上手 1.1什么是Vue 概念&#xff1a;Vue是一套构建用户界面的渐进式 框架 构建用户界面&#xff1a;基于数据渲染出用户可以看到的界面 渐进式&#xff1a;所谓渐进式就是循序渐进&#xff0c;不一定非得把Vue中所有的API都学完才能开发Vue&#xff0c;可以…

stable diffusion和gpt4-free快速运行

这是一个快速搭建环境并运行的教程 stable diffusion快速运行gpt快速运行 包含已经搭建好的环境和指令&#xff0c;代码等运行所需。安装好系统必备anaconda、conda即可运行。 stable diffusion快速运行 github: AUTOMATIC1111/稳定扩散网络UI&#xff1a;稳定扩散网页用户界…

【计算机网络黑皮书】应用层

【事先声明】 这是对于中科大的计算机网络的网课的学习笔记&#xff0c;感谢郑烇老师的无偿分享 书籍是《计算机网络&#xff08;自顶向下方法 第6版&#xff09;》 需要的可以私信我&#xff0c;无偿分享&#xff0c;课程简介下也有 课程连接 目录 应用层网络应用的原理应用架…

链表经典面试题(三)

合并两个有序链表 1.题目2.图文分析3.代码实现 1.题目 2.图文分析 我们通过两个连接和指向的中介&#xff0c;我们可以将两个链表依次连接起来&#xff0c;并且当其中一个链表走完后&#xff0c;另一个链表剩余的值都会比另一个链表的值大&#xff0c;所以直接将指向中介指向他…

Acwing 906. 区间分组

Acwing 906. 区间分组 知识点题目描述思路讲解代码展示 知识点 贪心 题目描述 思路讲解 这段代码是用来维护一个最小堆&#xff0c;以确保右边界不相交的区间被正确地保留在堆中。让我详细解释这段代码&#xff1a; heap.empty()&#xff1a;这个条件检查最小堆 heap 是否为…

8、Nacos服务注册服务端源码分析(七)

本文收录于专栏 Nacos 中 。 文章目录 前言确定前端路由CatalogController.listDetail()ServiceManager总结 前言 前文我们分析了Nacos中客户端注册时数据分发的设计链路&#xff0c;本文根据Nacos前端页面请求&#xff0c;看下前端页面中的服务列表的数据源于哪里。 确定前端…

计算机毕业设计 基于SSM的宿舍管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

全面解读 SQL 优化 - 统计信息

一、简介 数据库中的优化器&#xff08;optimizer&#xff09;是一个重要的组件&#xff0c;用于分析 SQL 查询语句&#xff0c;并生成执行计划。在生成执行计划时&#xff0c;优化器需要依赖数据库中的统计信息来估算查询的成本&#xff0c;从而选择最优的执行计划。以下是关…