归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,也是用空间换时间思维的体现。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
- 排序对象:数组、链表
- 时间复杂度:
- 空间复杂度:
- 是否稳定:是
void _MergeSort(int* arr, int begin, int end, int* tmp)
{
if (begin >= end)
return;
// 递归,先将数组无限分割,直到每个子数列的长度小于等于2
int mid = (begin + end) / 2;
_MergeSort(arr, begin, mid, tmp);
_MergeSort(arr, mid + 1, end, tmp);
int leftBegin = begin;
int leftEnd = mid;
int rightBegin = mid + 1;
int rightEnd = end;
int pos = begin;
while (leftBegin <= leftEnd && rightBegin <= rightEnd)
{
// 从前往后同步遍历两个子数列,将相对较小的值先写入tmp中
if (arr[leftBegin] < arr[rightBegin])
tmp[pos++] = arr[leftBegin++];
else
tmp[pos++] = arr[rightBegin++];
}
// 将还没遍历完的子数列的值一次性写入tmp中
while (leftBegin <= leftEnd)
{
tmp[pos++] = arr[leftBegin++];
}
while (rightBegin <= rightEnd)
{
tmp[pos++] = arr[rightBegin++];
}
// 内存数据copy,将临时存储有序子数列的tmp数组的值写入arr对应位置
memcpy(arr + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}
void MergeSort(int* arr, int n)
{
int* tmp = (int*)malloc(sizeof(int) * n);
_MergeSort(arr, 0, n - 1, tmp);
free(tmp);
tmp = NULL;
}