归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,也是用空间换时间思维的体现。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
- 排序对象:数组、链表
- 时间复杂度:
- 空间复杂度:
- 是否稳定:是
void _MergeSort(int* arr, int begin, int end, int* tmp)
{if (begin >= end)return;// 递归,先将数组无限分割,直到每个子数列的长度小于等于2int 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++];elsetmp[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;
}