基本思想:将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后将他们 合并成一个序列。合并两个子序列的过程称为两路归并.
void _Merge(int*arr, int*tmp, int begin1, int end1, int begin2, int end2)
{
int index = 0;
while (begin1 <= end1&&begin2 <= end2)
{
if (arr[begin1] < arr[begin2])
{
tmp[index++] = arr[begin1++];
}
if (arr[begin2]<arr[begin1])
{
tmp[index++] = arr[begin2++];
}
}
while (begin1 <= end1)
{
tmp[index++] = arr[begin1++];
}
while(begin2 <= end2)
{
tmp[index++] = arr[begin2++];
}
}
void _MergeSort(int*arr,int* tmp, int begin, int end)
{
if (begin >= end)
{
return;
}
int middle = begin + ((end - begin) >> 1);
_MergeSort(arr, tmp,begin, middle);
_MergeSort(arr,tmp, middle+1, end);
//[begin,mid-1][mid,end]全部划分完成之后开始进行合并
_Merge(arr, tmp, begin, middle, middle + 1, end);
memcpy(arr + begin, tmp, sizeof(int)*((end - begin) + 1));
}
void MergeSort(int*arr, int n)
{
int *tmp = new int[n];
_MergeSort(arr, tmp, 0, n-1);
delete[]tmp;
}