#include<iostream>
using namespace std;
void Merge(int* arr,int left,int right,int mid, int*& tmparr)
{
int begin1 = left, end1 = mid;
int begin2 = mid + 1, end2 = right;
int tmpi = left;
//下面合并两个数组为一个有序数组(升序);
while (begin1<=end1&&begin2<=end2)
{
if (arr[begin1] < arr[begin2])
{
tmparr[tmpi++] = arr[begin1++];
}
else if (arr[begin1] >= arr[begin2])
{
tmparr[tmpi++] = arr[begin2++];
}
}
while (begin1<=end1)
{
tmparr[tmpi++] = arr[begin1++];
}
while (begin2 <= end2)
{
tmparr[tmpi++] = arr[begin2++];
}
//每次子数组排序好都必须拷贝到原数组,使原数组越来越接近有序。如果被分割的子数组都不有序,那么合并成的大数组也一定不会有序。
memcpy(arr+left, tmparr+left, sizeof(int)*(right-left+1));
}
//时间复杂度O(N*logN),空间复杂度O(N);
void Merge_Sort(int* arr,int left,int right,int*& tmparr)
{
if (left >= right) return;
int mid = (left + right) / 2;
Merge_Sort(arr,left,mid,tmparr);
Merge_Sort(arr, mid+1, right,tmparr);
Merge(arr,left,right,mid,tmparr);
}
int main()
{
int arr[] = {66,72,53,41,38,39,25,40,90};
int size = sizeof(arr) / sizeof(int);
int* tmparr = new int[size];
//构建一个一模一样一样的数组,这也就是空间复杂度O(N)的原因;
Merge_Sort(arr,0,size-1,tmparr);
delete []tmparr;
for (auto& e:arr)
{
cout<<e<<" ";
}
return 0;
}