归并排序

时间复杂度:O(nlog n)

特性:

1、需要开辟额外空间

自顶向下的归并排序

#include
//—————————————————————归并排序————————————————————/
//将arr[l...mid]和arr[mid + 1...r]两部分进行归并
template 
void __merge(T arr[], int L, int mid, int R)
{
	
	//开辟零时空间
	T *aux=new T [1+R-L] ;
	//给开辟的空间赋值
	for (int i = L; i <= R; i++)
	{
		aux[i-L] = arr[i];
	}
	int i = L;
	int j = mid + 1;
	for (int k=L;k<=R;k++)
	{
		if (i > mid)
		{
			arr[k] = aux[j-L];
			j++;
		}
		else if (j > R)
		{
			arr[k] = aux[i-L];
			i++;
		}//只有i,j不越界,才能进行下面的归并
		else if (aux[i-L] < aux[j-L])
		{
			arr[k] = aux[i-L];
			i++;
		}
		else {
			arr[k] = aux[j-L];
			j++;
		}

	}
	delete[] aux;
}

//排序的数组,起始索引,终止索引 对arr[l....r]的范围进行排序
template 
void __mergeSort(T arr[], int L, int R )
{
	if (L >= R)
		return;
	int mid = L+(R-L) / 2;
	__mergeSort(arr, L, mid);
	__mergeSort(arr, mid+1,R );
	__merge(arr, L, mid, R);
	

}

template 
void mergeSort(T arr[], int n)
{
	//排序的数组,起始索引,终止索引
	__mergeSort(arr, 0 ,n - 1);
}

//————————————————————————————————————————————/
int main()
{
    mergeSort(arr, n);
    return 0;
}

自低向上归并排序:

template 
void __merge(T arr[], int L, int mid, int R)
{
	
	//开辟零时空间
	T *aux=new T [1+R-L] ;
	//给开辟的空间赋值
	for (int i = L; i <= R; i++)
	{
		aux[i-L] = arr[i];
	}
	int i = L;
	int j = mid + 1;
	for (int k=L;k<=R;k++)
	{
		if (i > mid)
		{
			arr[k] = aux[j-L];
			j++;
		}
		else if (j > R)
		{
			arr[k] = aux[i-L];
			i++;
		}//只有i,j不越界,才能进行下面的归并
		else if (aux[i-L] < aux[j-L])
		{
			arr[k] = aux[i-L];
			i++;
		}
		else {
			arr[k] = aux[j-L];
			j++;
		}

	}
	delete[] aux;
}
//————————————————————自低向上的归并排序———————————————/
template 
void mergeSortBu(T arr[], int n)
{
	//sz 表示每次分成多少份的大小
	for (int sz = 1; sz <= n; sz += sz)
	{
		for (int i = 0; i + sz < n; i = i + sz + sz)
//对arr[i...i+sz-1]和arr[i+sz...i+2*sz-1]进行归并
			__merge(arr, i, i + sz - 1, min(i + sz + sz - 1, n - 1)); 
	}

}

 

你可能感兴趣的:(C++,algorithm)