归并排序(非递归)

#include <iostream>
#include <math.h>

using namespace std;

// 要求[i1, j1], [i2, j2]两段已经排序
template <typename T>
void _merge(T a[], unsigned i1, unsigned j1, unsigned i2, unsigned j2)
{
	if (i2 == i1)
		return;

	unsigned pos = i1;
	T *temp = new T[j2 - i1 + 1];
	unsigned k = 0;
	while (i1 <= j1 && i2 <= j2)// 两组均未全部放入temp
	{
		if (a[i1] <= a[i2]) 
		{
			temp[k++] = a[i1++];
		}
		else
		{
			temp[k++] = a[i2++];
		}
	}
	while (i1 <= j1)// 第二组已全部放入,第一组未全部放入temp
	{
		temp[k++] = a[i1++];
	}
	while (i2 <= j2)// 第一组已全部放入,第二组为全部放入temp
	{
		temp[k++] = a[i2++];
	}
	for (unsigned i = 0; i < k; i++)
	{
		a[pos + i] = temp[i];
	}
	delete[] temp;
}

// 方法一
template <typename T>
void MergeSort(T a[], unsigned n)
{
	for (size_t size = 1; size < n; size *= 2)
	{
		unsigned i1 = 0;
		while (i1 + size < n)
		{
			unsigned i2 = i1 + size;
			unsigned j1 = i2 - 1;
			int j2;
			if (i2 + size - 1 > n - 1)
			{
				j2 = n - 1;
			}
			else
			{
				j2 = i2 + size - 1;
			}				
			_merge(a, i1, j1, i2, j2);
			i1 = j2 + 1;
		}
	}
}

// 方法二
template <typename T>
void MergeSort_2(T a[], unsigned n)
{
	for (size_t size = 1; size < n; size *= 2)
	{
		for (size_t i = 0; i < ceilf((float)n / (2.0f * size)); i++)
		{
			unsigned i1 = i * 2 * size, j1 = i * 2 * size + size - 1;
			unsigned i2 = i * 2 * size + size, j2 = i * 2 * size + 2 * size - 1;
			int r = (i + 1) * 2 * size - n;
			if (r > 0)// 最后一段不满
			{
				_merge(a, i1, j1, i2, j2 - r);
			}
			else 
			{
				_merge(a, i1, j1, i2, j2);
			}
		}
	}
}

int main()
{
	int a[] = {48, 36, 72, 68, 48, 12, 2};
	MergeSort_2(a, 7);
	for (size_t i = 0; i < 7; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值