1.算法原理
把两个或多个有序的子序列合并为一个
2.归并排序算法步骤
- 若low<high,则将序列从中间mid=(low+high)/2分开
- 对左半部分[low,mid]递归地进行归并排序
- 对右半部分[mid+1,high]递归地进行归并排序
- 将左右两个有序的子序列Merge为一个
3.具体算法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Merge(int A[],int B[],int low,int high)
{
int i,j,k;
int mid=(low+high)/2;
for(i=low;i<=high;i++)
B[i]=A[i];//将A中所有元素复制到B中
for(i=low,k=i,j=mid+1;i<=mid&&j<=high;k++)
{
if(B[i]<B[j])
A[k]=B[i++];
else A[k]=B[j++];//将两个部分中较小值复制到A中
}
while(i<=mid) A[k++]=B[i++];
while(j<=high) A[k++]=B[j++];
}
void MergeSort(int A[],int B[],int low,int high)
{
int mid=(low+high)/2;//从中间划分
if(low<high)
{
MergeSort(A,B,low,mid);//对左半部分归并排序
MergeSort(A,B,mid+1,high);//对右半部分归并排序
Merge(A,B,low,high);//归并
}
}
int main()
{
int arr[8]={0,19,30,25,20,10,5,44};
int i;
int *B=(int*)malloc(8*sizeof(int));
MergeSort(arr,B,0,7);
for(i=0;i<8;i++)
{
printf("%d\t",arr[i]);
}
}
4.性能分析
- 时间复杂度:n个元素进行2路归并排序,归并趟数为log2n(向上取整),每趟归并时间复杂度为O(n),则算法的时间复杂度为O(nlog2n);
- 空间复杂度:O(n)
- 稳定性:稳定