# 【数据结构】归并排序

``````#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;
}``````

THE END