归并排序

#define Max 2147483647

#include <iostream>
#include <cstdlib>

using namespace std;

void Merge(int *A, int p, int q, int r)
{
	int i, j;
	int n1 = q - p + 1;
	int n2 = r - q;
	//归并堆
	int *L = new int[n1 + 1];
	//归并堆
	int *R = new int[n2 + 1];
	for (i = 0; i < n1; ++i)
	{
		L[i] = A[p + i - 1];
	}
	for (j = 0; j < n2; ++j)
	{
		R[j] = A[q + j];
	}
	L[n1] = Max;
	R[n2] = Max;
	i = 0;
	j = 0;
	for (int k = p - 1; k < r; ++k)
	{
		if (L[i] <= R[j])
		{
			A[k] = L[i++];
		}
		else
		{
			A[k] = R[j++];
		}
	}
}

void MergeSort(int *A, int p, int r)
{
	if (p < r)
	{
		int q = (p + r) / 2;
		MergeSort(A, p, q);
		MergeSort(A, q + 1, r);
		Merge(A, p, q, r);
	}
}

int main(void)
{
	int A[7] = { 18, 45, 36, 30, 92, 72, 25 };
	MergeSort(A, 1, 7);
	for (int i = 0; i < 7; ++i)
	{
		cout << A[i] << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}

  

分析:T(n) = c  若n=1

       =2T(n/2)+cn  若n>1

   解得:T(n) = 2^(log(2)n)T(1) + (2^0+2^1+···+2^(log(2)n - 1))cn

        =2^(log(2)n)c + (2^0+2^1+···+2^(log(2)n - 1))cn

   总代价为cnlgn+cn,它就是O(nlgn)。

原文地址:https://www.cnblogs.com/mubu/p/5786033.html