采用分治的思想
void merge(int arr[], int l, int m, int r)
{
int i,j,k;
//n1代表左边数组的长度,包括中点
//n2代表右边数组的长度
int n1 = m - l + 1;
int n2 = r - m;
int* L = new int[n1];
int* R = new int[n2];
//分别给L和R数组赋值
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
i = 0;
j = 0;
k = l;
//i代表左边数组第一个元素,j代表右边数组第一个元素
while (i < n1 && j < n2)
{
//把小的元素放到数组中
if (L[i] <= R[j])
arr[k++] = L[i++];
else
arr[k++] = R[j++];
}
//判断还剩下的一个,放入数组中
while (i < n1) arr[k++] = L[i++];
while (j < n2) arr[k++] = R[j++];
}
void mergeSort(int arr[], int l, int r)
{
if (l >= r)
return;
//找出中间值mid
int m = (l + r) / 2;
//对左边进行递归
mergeSort(arr, l, m);
//对右边进行递归
mergeSort(arr, m + 1, r);
//合并
merge(arr, l, m, r);
}