归并排序的实现

一.思想

归并排序是一种基于分治思想的经典排序算法。其主要思想可以总结为以下几个步骤:

  1. 分解(Divide): 将原始序列划分为若干子序列,直到每个子序列包含一个或零个元素,即认为这些子序列是有序的。

  2. 解决(Conquer): 对每个子序列进行递归排序。如果子序列的长度为1或零,那么它被认为是有序的。否则,对子序列递归应用归并排序。

  3. 合并(Merge): 将已排序的子序列合并为一个新的有序序列。这是通过比较每个子序列的头部元素,选择最小的元素放入新序列,然后将相应子序列的指针向后移动一步,直到所有的子序列都被合并为一个新序列。

一个简单的归并

二.实现

1.递归实现

void _Merge(int* a, int* temp, int left, int right)//归并递归
{
	if (left >= right)
		return;
	int mid = (right + left) / 2;
	_Merge(a, temp, left, mid);
	_Merge(a, temp, mid+1, right);
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
	int cout = left;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] <= a[begin2])
		{
			temp[cout++] = a[begin1];
			begin1++;
		}
		else
		{
			temp[cout++] = a[begin2];
			begin2++;
		}
	}
	while (begin1 <= end1)
	{
		temp[cout++] = a[begin1];
		begin1++;
	}
	while (begin2 <= end2)
	{
		temp[cout++] = a[begin2];
		begin2++;
	}
	memcpy(a+left, temp+left, (right - left + 1) * sizeof(int));
}
void MergeSort(int* a, int n)//归并
{
	int* temp = (int*)malloc(n * sizeof(int));
	assert(temp);
	_Merge(a, temp, 0, n-1);
	free(temp);
}

将每一段分到有序.再合并两个有序序列,从最小系列向上合并

注意temp数组拷贝回去的位置,

2.非递归

void MergeNonRSort(int* a, int n)//归并排序非递归
{
	int* temp = (int*)malloc(n * sizeof(int));
	assert(temp);
	int gap = 1;
	while(gap<n)
	{
		for (int i = 0; i < n; i += 2 * gap)
		{
			int begin1 = i, end1 = i + gap - 1;
			int begin2 = i + gap, end2 = i + 2 * gap - 1;
			int cout = i;
			if (begin2 >= n)
				break;
			if (end2 >= n)
			{
				end2 = n - 1;
			}
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] <= a[begin2])
				{
					temp[cout++] = a[begin1];
					begin1++;
				}
				else
				{
					temp[cout++] = a[begin2];
					begin2++;
				}
			}
			while (begin1 <= end1)
			{
				temp[cout++] = a[begin1];
				begin1++;
			}
			while (begin2 <= end2)
			{
				temp[cout++] = a[begin2];
				begin2++;
			}
			memcpy(a + i, temp + i, (end2-i+1) * sizeof(int));
		}
		gap *= 2;
	}
	free(temp);
}

gap表示每一有序序列的元素个数,从最小的1个元素开始合并,两两合并

注意边界的取值,当第二个序列全越界,便需要再合并,只越界end就修正边界值

三.特点

1.优势:

  1. 稳定性: 归并排序是一种稳定的排序算法,即对于具有相等键值的元素,其相对顺序在排序后保持不变。

  2. 用于文件: 归并排序在对硬盘内的数据进行排序更方便,和其他排序结合可很好的对文件排序

2,缺点:

  1. 额外空间需求: 归并排序需要额外的内存空间来存储中间结果,这使得它在处理大规模数据时的空间复杂度较高。对于内存受限的环境,这可能是一个显著的缺点。

  2. 不适合小规模数据: 对于小规模的数据集,归并排序的性能可能不如一些简单的排序算法,

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Xcode编译速度慢是什么原因?如何提高编译速度?

Hello各位伙伴们好&#xff0c;我是咕噜铁蛋&#xff01;作为一个开发者&#xff0c;我们都希望能够高效地开发应用程序&#xff0c;而编译速度是影响开发效率的重要因素之一。然而&#xff0c;有时候我们会发现在使用 Xcode 进行开发时&#xff0c;编译速度非常慢&#xff0c;…

beebox靶场A3 中等级别 xss通关教程

特别注意&#xff0c;低级和中级的差别在于中级使用了一些函数进行了过滤或转义字符 例如 addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。 预定义字符是&#xff1a; 单引号&#xff08;&#xff09;双引号&#xff08;"&#xff09;反斜杠&#xff08;\&…

国内安卓、iOS在选择广告变现平台上有哪些不同?

流量作为广告变现的基础&#xff0c;如何合理利用流量&#xff0c;发挥其最大价值&#xff0c;是每个媒体都会面临的问题。售卖流量&#xff0c;可以通过聚合SDK进行分发售卖&#xff0c;广告分层需要根据产品本身的表现效果进行调整&#xff0c;不同广告平台在不同的应用里面表…

怎么让gpt帮忙改文章 (1) 快码论文

大家好&#xff0c;今天来聊聊怎么让gpt帮忙改文章 (1)&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 怎么让GPT帮忙改文章 一、背景介绍 随着人工智能的发展&#xff0c;自然语言处理技术已经成为了许…

BeautifulSoup学习

前期准备&#xff1a; pip install bs4 pip install lxml bs解析器 从上面的表格可以看出&#xff0c;lxml解析器可以解析HTML和XML文档&#xff0c;并且速度快&#xff0c;容错能力强&#xff0c;所有推荐使用它。 节点选择器 获取名称 soup BeautifulSoup(<b class&…

【Spark精讲】Spark作业执行原理

基本流程 用户编写的Spark应用程序最开始都要初始化SparkContext。 用户编写的应用程序中&#xff0c;每执行一个action操作&#xff0c;就会触发一个job的执行&#xff0c;一个应用程序中可能会生成多个job执行。一个job如果存在宽依赖&#xff0c;会将shuffle前后划分成两个…

得帆云为玉柴打造CRM售后服务管理系统,实现服务全过程管理|基于得帆云低代码的CRM案例系列

广西玉柴机器股份有限公司 广西玉柴机器股份有限公司始建于1992年&#xff0c;是国内行业首家赴境外上市的中外合资企业&#xff0c;产品远销亚欧美非等180多个国家和地区。公司总部设在广西玉林市&#xff0c;下辖11家子公司&#xff0c;生产基地布局广西、江苏、安徽、山东等…

云服务器部署可视化Docker私有仓库(Ubuntu)

这里测试的机器为ubuntu22.04 一、环境安装 docker安装就不赘述了 先升级&#xff0c;再从官方仓库安装docker compose apt update apt upgrade apt install docker-compose二、部署私有仓库UI Docker提供了一个叫registry的镜像&#xff0c;给大家搭建私有仓库&#xff0c…

《地理信息系统原理》笔记/期末复习资料(12. 地理信息工程)

目录 12. 地理信息工程 12.1. 地理信息系统工程的概念 12.2. 地理信息系统工程建设过程 12.2.1. 应用型地理信息系统设计步骤和方法 12.2.2. 需求分析 12.2.3. 系统设计 12.2.4. 系统开发与实施 12.2.5. 系统的评价和维护 12.3. GIS标准 12.4. 习题 12. 地理信息工程…

交友系统:打造独具魅力的社交平台!APP小程序H5三端源码交付,支持二开!

随着社交媒体的兴起&#xff0c;交友系统成为了现代社会不可或缺的一部分。人们希望通过网络结识新朋友&#xff0c;拓展社交圈&#xff0c;寻找志同道合的伙伴&#xff0c;甚至找到自己的爱情。本文将为您介绍交友系统的定义、功能以及如何打造一个独具魅力的社交平台。 一个成…

maui sqlite开发一个商城加购物车的演示(1)

界面演示 using ShoppingUI;namespace ShoppingUI;public partial class App : Application {public App(){InitializeComponent();MainPage new LoginPage();}static LoginDatabase database;// Create the database connection as a singleton.public static LoginDatabase …

记录 DevEco 开发 HarmonyOS 应用开发问题记录 【持续更新】

HarmonyOS 应用开发问题记录 HarmonyOS 应用开发问题记录一、预览器无法成功运行?如何定位预览器无法编译问题? 开发遇到的问题 HarmonyOS 应用开发问题记录 一、预览器无法成功运行? 大家看到这个是不是很头疼? 网上能看到许多方案,基本都是关闭一个配置 但是他们并…

优雅玩转实验室服务器(三)vscode is all you need

在前两章解决了传输问题和连接问题后&#xff0c;我们紧接着遇到一个新的需求&#xff1a;我们需要coding呀&#xff0c;你当然可以说&#xff0c;我们可以用vim和对应的插件来搭建一个IDE呀&#xff0c;fine&#xff0c;我甚至可以给你推荐如下的教程&#xff1a; Vim 到底可…

计网 - TCP扫盲

文章目录 知识点TCP头格式TCP有限状态机&#xff08;FSM&#xff09;为何需要TCP协议TCP的定义TCP连接的概念如何唯一确定一个TCP连接TCP vs UDPTCP拥塞控制TCP流量控制 导图 知识点 TCP头格式 TCP头部包含多个字段&#xff0c;其中一些是必需的&#xff0c;而另一些是可选的…

Linux 搭建 gitlab

目录 前言安装依赖项添加GitLab存储库安装GitLab CE创建新存储目录编辑GitLab配置文件,例如更改默认域名或端口:重新配置并启动GitLab服务以应用更改:前言 centos搭建gitlab代码仓库 安装依赖项 在安装GitLab之前,您需要先安装一些必要的依赖项: yum install -y curl …

c# bitmap压缩导致png不透明的问题解决

新建.net 6控制台项目 安装System.Drawing.Common包 代码如下 using System.Drawing; using System.Drawing.Imaging;namespace PngCompress02 {internal class Program{static void Main(string[] args){CompressPngImage("E:\Desktop\6.png", "E:\Desktop\6…

C# WPF上位机开发(会员充值软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在软件开发中&#xff0c;有一种很重要的控件&#xff0c;那就是表格。大家可以想象下&#xff0c;办公软件里面是不是就有一个专门做表格的软件&a…

路由基本原理

目录 一、路由器概述 二、路由器的工作原理 三、路由表的形成 四、路由配置 1.连接设备 2.进入系统模式 3.进入接口模式 4.配置网络 5.下一跳的设置 6.设置浮动路由 7.设置默认路由 一、路由器概述 路由器&#xff08;Router&#xff09;是一种用于连接不同网络或子…

高通平台开发系列讲解(USB篇)MBIM协议详解

文章目录 一、MBIM协议二、MBIM 消息类型三、基本控制消息构成3.1、MBIM OPEN MSG FORMAT3.2、MBIM CLOSE MSG FORMAT3.3、MBIM_COMMAND_MSG3.4、MBIM_COMMAND_DONE3.5、MBIM_INDICATE_STATUS_MSG四、MBIM Message(UUID+CID)4.1、UUID_BASIC_CONNECT

持续集成交付CICD:Jenkins流水线操作Harbor仓库

目录 一、实验 1.Jenkins主节点安装Docker 2.Jenkins主节点安装Harbor 3.Jenkins从节点安装Docker 4.Jenkins流水线操作Harbor仓库 二、问题 1.Jenkins主节点登录Harbor仓库报错 2.Jenkins流水线里从节点操作docker报错 3.Jenkins流水线里从节点远程登录Harbor仓库报错…