首页 > 编程语言 >排序算法:归并排序

排序算法:归并排序

时间:2022-12-04 21:33:51浏览次数:37  
标签:sz 归并 end2 begin2 int begin1 算法 排序 left

递归实现

void _MergeSort(int* arr, int left, int right, int* tmp)
{
	if (left >= right)
		return;
	int mid = left + (right - left) / 2;
	_MergeSort(arr, left, mid, tmp);
	_MergeSort(arr, mid + 1, right, tmp);
	int begin1 = left;
	int end1 = mid;
	int begin2 = mid + 1;
	int end2 = right;
	int p = left;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (arr[begin1] < arr[begin2])
		{
			tmp[p++] = arr[begin1++];
		}
		else
		{
			tmp[p++] = arr[begin2++];
		}
	}
	while(begin1 <= end1)
		tmp[p++] = arr[begin1++];
	while (begin2 <= end2)
	{
		tmp[p++] = arr[begin2++];
	}
	for (int i = left; i <= right; i++)
	{
		arr[i] = tmp[i];
	}
}
void MergeSort(int* arr, int sz)
{
	int* tmp = (int*)malloc(sizeof(int) * sz);
	_MergeSort(arr, 0, sz - 1, tmp);
	free(tmp);
}

非递归实现

void MergeSort(int* arr, int sz)
{
	int* tmp = (int*)malloc(sizeof(int) * sz);
	int gap = 1;
	while (gap < sz)
	{
		for (int i = 0; i < sz; i += 2 * gap)
		{
			int begin1 = i;
			int end1 = begin1 + gap - 1;
			int begin2 = end1 + 1;
			int end2 = begin2 + gap - 1;
			int index = begin1;
			if (end1 >= sz)
				end1 = sz - 1;
            
			// begin2 越界,第二个区间不存在
			if (begin2 >= sz)
			{
				begin2 = sz;
				end2 = sz - 1;
			}
			// begin2 ok, end2越界,修正end2即可
			if (begin2 < sz && end2 >= sz)
				end2 = sz - 1;
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (arr[begin1] < arr[begin2])
					tmp[index++] = arr[begin1++];
				else
					tmp[index++] = arr[begin2++];
			}
			while(begin1 <= end1)
				tmp[index++] = arr[begin1++];
			while(begin2 <= end2)
				tmp[index++] = arr[begin2++];
			for (int j = i; j < index; j++)
			{
				arr[j] = tmp[j];
			}
		}
		//memcpy(arr, tmp, sizeof(int) * sz);//copy到arr也可以直接这样
		gap *= 2;
	}
    free(tmp);
}

归并排序可以实现外排序。

标签:sz,归并,end2,begin2,int,begin1,算法,排序,left
From: https://www.cnblogs.com/ncphoton/p/16950873.html

相关文章

  • 卡尔曼滤波之最优状态估计和最优状态估计算法
    1.最优状态估计情景1:假设一个一个比赛中,不同队伍的自动驾驶汽车使用GPS定位,在100种不同的地形上各行驶1公里。每次都尽可能停在终点。然后计算每只队伍的平均最终......
  • 页式存储管理--两种置换算法的实现
    一.实验目的1.了解虚拟存储技术,通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。2.掌握FIFO和LRU等置换算法,加强对地址转换过程的了解。二.实验内容......
  • sm-crypto密码算法库
    一、环境配置在之前的node.js库配置中,我们已经配置好了node和npm,再次检查配置情况node-vnpm-vnpminstall--saveminiprogram-sm-crypto二、进入工作目录/usr/l......
  • 第二章 算法基础
    第2章算法基础第二周记于2022/12/4如何描述算法使用一致性符号来分析算法的运算时间通过归并排序来学习分而治之方法插入排序......
  • 如何用JDK优雅的实现几个算法
    今天给大家介绍下八股文中的两个重要成员,LinkedHashMap和TreeMap。 这两者都实现了Map接口,也经常会在面试中被拿来与HashMap比较。 到底它们能使用哪些魔法呢,接下来......
  • 排序链表 重排链表 最接近目标价格的甜点成本 环形链表
    148.排序链表弄到数组里,数组排序,再弄个新链表Listlist=newArrayList<>();ListNodepre=head;while(pre!=null){list.add(pre.val);pre=pre.next;}int[......
  • Node.js实现国密算法
    一、node.js环境安装1去官网下载压缩包,并放置到/usr/local/bin文件夹下2进行环境变量配置vim/etc/profile在环境变量文件的末尾添加exportNODEJS=/usr/local/b......
  • golang的希尔排序
    1、什么是希尔排序:插入排序的一种又称“缩小增量排序”(DiminishingIncrementSort),是直接插入排序算法​的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.......
  • 算法刷题532113D
    题目链接https://vjudge.net/contest/532113#problem/D思考虽然AC之后觉得题目难度不是很高,但也是第一次做比较综合的题目,花了快一天才做出来,只能说水平还是菜思路......
  • 第一章 算法在计算中的作用
    第1章算法在计算中的作用第一周记于2022/12/4“是否存在一个通用的过程(算法)。可以自动判定任意命题是否正确?”否算法:一个定义明确的是可计算过程(Input->......