对于归并排序递归的理解

在这里插入图片描述
空间优化:没必要每次开一个临时数组 可以开一个然后导回来再导出去
多适用于外排序。

void merge(int a[], int l1, int r1, int l2, int r2)
{
	int i = l1, j = l2;
	int temp[100], index = 0;
	while (i <= r1 && j <= r2)
	{
		if (a[i] <= a[j])
			temp[index++] = a[i++];
		else
			temp[index++] = a[j++];
	}
	while (i <= r1)
		temp[index++] = a[i++];
	while (j <= r2)
		temp[index++] = a[j++];
	for (i = 0; i < index; i++)
	{
		a[l1 + i] = temp[i];
	}
}
void mergesort(int a[],int left,int right)
{
	if (left >= right)
		return;
	int mid = (left + right) / 2;
	mergesort(a, left, mid );
	mergesort(a, mid + 1, right);
	merge(a, left, mid, mid + 1,right);
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int maxn = 100;
void merge(int a[], int l1, int r1, int l2, int r2)
{
	int i = l1, j = l2;
	int temp[100], index = 0;
	while (i <= r1 && j <= r2)
	{
		if (a[i] <= a[j])
			temp[index++] = a[i++];
		else
			temp[index++] = a[j++];
	}
	while (i <= r1)
		temp[index++] = a[i++];
	while (j <= r2)
		temp[index++] = a[j++];
	for (i = 0; i < index; i++)
	{
		a[l1 + i] = temp[i];
	}
}
void mergesort(int a[],int left,int right)
{
	if (left >= right)
		return;
	int mid = (left + right) / 2;
	mergesort(a, left, mid );
	mergesort(a, mid + 1, right);
	merge(a, left, mid, mid + 1,right);
}
int main()
{
	int a[maxn],n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	mergesort(a, 0, n - 1);
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
}
原文地址:https://www.cnblogs.com/Hsiung123/p/13812061.html