c语言版本:
cpp
void MergeSort(int* array, int n)
{
int* temp = (int*)malloc(sizeof(int) * n);
if (NULL == temp)
{
assert(0);
printf("fail\n");
}
_MergeSort(array, 0, n, temp);
}
void _MergeSort(int array[], int left, int right, int *temp)
{
// 如果区间元素个数小于一个即不进行排序
if (right - left <= 1)
return;
// 将数组分为左右俩个区间
int mid = left + ((right - left) >> 1);
// 递归遍历左右区间
_MergeSort(array, left, mid, temp);
_MergeSort(array, mid, right, temp);
// 将左右区间元素进行归并
MergeData(array, left, mid, right, temp);
// 将辅助空间中的元素拷贝到原空间
memcpy(array + left, temp + left, (right - left) * sizeof(int));
}
void MergeData(int array[], int left, int mid, int right, int* temp)
{
int begin1 = left;
int end1 = mid;
int begin2 = mid;
int end2 = right;
// 数组的合并
int index = left;
while (begin1 < end1 && begin2 < end2)
{
if (array[begin1] <= array[begin2])
temp[left++] = array[begin1++];
else
temp[left++] = array[begin2++];
}
while(begin1<end1)
temp[left++] = array[begin1++];
while(begin2<end2)
temp[left++] = array[begin2++];
}
归并排序 二叉树的后序遍历
c++版本
cpp
class Solution {
public:
vector<int> temp; // 全局temp用来还原数组
void mergesort(int left, int right, vector<int>& nums)
{
if(left >= right) return;
int mid = left + ((right-left)>>1);
mergesort(left, mid, nums); // 合并【left,mid】
mergesort(mid+1, right, nums); // 合并【mid+1,right】
mergedata(left, mid, right, nums); // 合并数据
}
void mergedata(int left, int mid, int right, vector<int>& nums)
{
// 将left到mid 和 mid+1到right进行有序数组的合并
int cur1 = left, cur2 = mid+1;
int small = left;
while(cur1 <= mid && cur2 <= right)
temp[small++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
// 处理没有访问到最后边界部分
while(cur1 <= mid)
temp[small++] = nums[cur1++];
while(cur2 <= right)
temp[small++] = nums[cur2++];
// 将temp还原到nums 也可以直接返回temp
for(int i = left; i <= right; i++)
nums[i] = temp[i];
}
vector<int> sortArray(vector<int>& nums) {
temp.resize(nums.size());
mergesort(0, nums.size()-1, nums);
return nums;
}
};