【数据结构】归并排序

目录

递归

非递归


递归

void _MergeSort(int* arr, int* tmp, int left, int right)
{
	if (left >= right)
		return;

	int mid = (left + right) / 2;

	_MergeSort(arr, tmp, left, mid);
	_MergeSort(arr, tmp, mid + 1, right);

	int l1 = left;
	int l2 = mid + 1;
	int r1 = mid;
	int r2 = right;
	int i = left;

	while (l1 < r1 && l2 < r2)
	{
		if (arr[l1] <= arr[l2])
			tmp[i++] = arr[l1++];
		else
			tmp[i++] = arr[l2++];
	}

	while (l1 <= r1)
		tmp[i++] = arr[l1++];

	while (l2 <= r2)
		tmp[i++] = arr[l2++];

	memcpy(arr + left, tmp + left, (right - left + 1) * sizeof(int));
}

void MergeSort(int* arr, int size)
{
	int* tmp = (int*)malloc(sizeof(int) * size);
	assert(tmp);

	_MergeSort(arr, tmp, 0, size - 1);

	free(tmp);
	tmp = NULL;
}

非递归

void MergeSortNonR(int* arr, int* tmp, int size)
{
	int tmp = (int*)malloc(sizeof(int) * size);
	assert(tmp);

	int gap = 1;
	while (gap < size)
	{
		for (int j = 0; j < size; j += 2 * gap)
		{
			int begin1 = j, end1 = j + gap - 1;
			int begin2 = j + gap, end2 = j + 2 * gap - 1;

			if (end1 >= size)
				break;
			if (begin2 >= size)
				break;
			if (end2 >= size)
				end2 = size - 1;

			int i = j;
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (arr[begin1] <= arr[begin2])
					tmp[i++] = arr[begin1++];
				else
					tmp[i++] = arr[begin2++];
			}

			while (begin1 <= end1)
				tmp[i++] = arr[begin1++];
			while (begin2 <= end2)
				tmp[i++] = arr[begin2++];
			memcpy(arr + j, tmp + j, (end2 - j + 1) * sizeof(int));
		}
		gap *= 2;
	}
	free(tmp);
	tmp = NULL;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值