一、归并排序的思想:

1.每次将一组数分为两组,直到不能再分为止;

2.从个数最小的数组开始比较,每次将比较大(或小)的数放入辅助数组中,辅助数组的下标+1,如此循环,直到有一个数组比较完,此时如果另外一个数组有剩余,就将剩余的这些数字全部按顺序加入辅助数组中。从最小的数组向上一步步累加,如果每次小的数组有序,那么合并以后的数组就有序。(下面这幅图给出的是一种分割两个数组的方法,分的时候最好从中间分)


二、归并排序的递归实现

void _MergeSort(int* a,int* tmp,int left,int right)
{
	int mid = left + ((right-left)>>1);	//每次找到当前数组的中位数
	if (left < mid)
		_MergeSort(a,tmp,left,mid);
	if (mid+1 < right)
		_MergeSort(a,tmp,mid+1,right);

	int begin1 = left;	//指向第一个数组开始
	int end1 = mid;
	int begin2 = mid+1;	//指向第二个数组开始
	int end2 = right;
	int index = left;	//辅助数组tmp的下标
	while (begin1 <= end1 && begin2 <= end2)	//只要有一个区间的数据取完完就停止循环
	{
		if (a[begin1] < a[begin2])
			tmp[index++] = a[begin1++];
		else
			tmp[index++] = a[begin2++];
	}

	//将两个区间中较长区间的剩余部分拷贝完
	while(begin1 <= end1)
	{
		tmp[index++] = a[begin1++];
	}
	while(begin2 <= end2)
	{
		tmp[index++] = a[begin2++];
	}
	//每次将排好序的辅助数组中的值重新赋给原来数组
	for (int i=0; i<index; ++i)
	{
		a[i] = tmp[i];
	}
}
void MergeSort(int* a,int begin, int end)
{
	 assert(a);
	 
	 //int tmp[10];
	 int* tmp = new int[end-begin+1];
	 _MergeSort(a,tmp,begin,end);
}



本文转载:CSDN博客