递归实现
时间复杂度:O(nlgn)
空间复杂度:O(1)
http://m.blog.youkuaiyun.com/allen_fan_11/article/details/9097019
思路总结:
(1)先递归分割
(2)再合并(把两个有序数组进行排序合并)
#include<stdio.h>
void merge(int arr[], int l, int mid, int r) //合并
{
int i = l;
int j = mid + 1;
int *t = new int[r - l + 1]; //开辟一个辅助数组t
int k = 0;
while (i <= mid && j <= r) //依次比较,取小值存入t[k]
{
if (arr[i] < arr[j])
{
t[k++] = arr[i++];
}
else
t[k++] = arr[j++];
}
while (i <= mid) //当其中一个数组遍历完成,把剩下的全部接过去
{
t[k++] = arr[i++];
}
while (j <= r)
{
t[k++] = arr[j++];
}
for (k = l,i = 0; i < r - l + 1; i++) //把整个t数组拷贝给arr
{
arr[k] = t[i];
k++;
}
}
void MergeSort(int arr[], int l, int r) //递归分割
{
if (l < r)
{
int q = (l + r) / 2;
MergeSort(arr, l, q);
MergeSort(arr, q + 1, r);
merge(arr, l, q, r);
}
}
int main()
{
int arr[] = { 71, 61, 42, 8, 9, 3, 2 };
//数组长度 = 数组元素的总个数
int length = sizeof(arr) / sizeof(arr[0]);
//传入的l,r是数组的下标值,因此是0和length-1
MergeSort(arr, 0, length - 1);
for (int i = 0; i < length; i++)
printf("%5d", arr[i]);
printf("\n");
}