- 算法思想:把两个或多个有序的子序列合并为一个
- 2路归并----二合一
- n路归并----n合一
- 若low>high,则将序列从中间mid = (low + high)/ 2分开
- 对左半部分[low, mid]递归进行归并排序
- 对右半部分[mid + 1, high]递归进行归并排序
- 将左右两个子序列合并为一个
- 空间复杂度:O(n)
- 时间复杂度:O(nlog n)
- 稳定
#include<stdio.h>
#include<stdlib.h>
//归并函数
void Merge(int arr[], int low, int mid, int high)
{
int n = high + 1;
int* B = malloc(n * sizeof(int));
int i, j, k;
for (k = low; k <= high; k++)
{
B[k] = arr[k];
}
for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++)
{
if (B[i] <= B[j])
{
arr[k] = B[i++];
}
else
{
arr[k] = B[j++];
}
}
while (i <= mid)
{
arr[k++] = B[i++];
}
while (j <= high)
{
arr[k++] = B[j++];
}
}
//归并排序
void MergeSort(int arr[], int low, int high)
{
if (low < high)
{
int mid = (low + high) / 2;//从中间划分
MergeSort(arr, low, mid);//对左半部分归并排序
MergeSort(arr, mid + 1, high);//对右半部分归并排序
Merge(arr, low, mid, high);//归并操作
}
}
void main()
{
int arr[] = { 4,62,632,6235,6325,623,235 };
int low = 0, high = sizeof(arr) / sizeof(int);
MergeSort(arr, low, high - 1);
for (int i = 0; i < high; i++)
{
printf("%d\n", arr[i]);
}
}