栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

归并排序-非递归算法C++

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

归并排序-非递归算法C++

template 
void merge(vector& a, vector& tempArray, int leftPos, int rightPos, int rightEnd)
{
	int leftEnd = rightPos - 1;
	int numElements = rightEnd - leftPos + 1;
	int tempPos = leftPos;
	while (leftPos <= leftEnd && rightPos <= rightEnd)
	{
		if (a[leftPos] <= a[rightPos])
		{
			tempArray[tempPos++] = std::move(a[leftPos++]);
		}
		else
		{
			tempArray[tempPos++] = std::move(a[rightPos++]);
		}
	}
	while (leftPos <= leftEnd)
	{
		tempArray[tempPos++] = std::move(a[leftPos++]);
	}
	while (rightPos <= rightEnd)
	{
		tempArray[tempPos++] = std::move(a[rightPos++]);
	}
	for (int i = rightEnd; numElements > 0; numElements--, i--)
	{
		a[i] = std::move(tempArray[i]);
	}
}


template 
void mergeSort(vector& a)
{
	vector tempArray(a.size());
	int n = a.size();
	for (int subListSize = 1; subListSize < n; subListSize *= 2) //初始表的大小为1,后续为2, 4, 8,直到只有两个子表
	{
		int leftPos = 0;
		while (leftPos + subListSize <= n - 1) //循环将每两个子表合并为一个有序表。
		{
			int rightPos = leftPos + subListSize;
			int rightEnd = std::min(n - 1, rightPos + subListSize - 1);
			merge(a, tempArray, leftPos, rightPos, rightEnd);
			leftPos = rightEnd + 1;
		}
	}
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982170.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号