title: 归并排序
date: 2019-09-18 17:04:34
tags:
1.算法设计
**二路归并排序采用分而制之的方法,先将其一步步拆分
{2 5 3 6 1 4 7 8} --先通过mergesort将数组拆分为单个元素
{2 5 3 6 }{1 4 7 8 }
{2 5 } {3 6} {1 4} {7 8}
{2}{5}{3}{6}{1}{4}{7}{8}
{2 5} {3 6} {1 4} {7 8} --然后在通过merge合并
{2 3 5 6} {1 4 7 8}
{1 2 3 4 5 6 7 8}**
Mergesort算法
void mergesort(int a[],int i,int j){ //i指向left j指向high
int m;
if(i!=j){
m=(i+j)/2;
mergesort(a,i,m);//递归调用mergesort
mergesort(a,m+1,j);// 递归调用mergesort
merge(a,i,j,m);//归并数组
}
}
归并算法:
void merge(int a[],int i,int j,int m)
{
//创建一个辅助数组help
int *help = (int *)malloc((j-i+1)*sizeof(int));//辅助数组长度等于a
int p1=i;
int p2=m+1;
while(p1<=m&&p2<=j){
help[i++]=a[p1]<a[p2]?a[p1++]:a[p2++];//将左右区域较小元素放进help,有可能有的区域没有完全放入help
}
//下面两个循环只能运行一个,
while(p1<=m){
help[i++]=a[p1++];
}
while(p2<=j){
help[i++]=a[p2++];
}
for(int n=0;n<;n++){ //将help中的数据copy到a中
a[n]=help[n];
}
}
2.程序清单
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
void merge(int a[],int l,int r,int mid)
{
//创建一个辅助数组help
int *help = (int *)malloc((r-l+1)*sizeof(int));
//int help[8];//辅助数组长度等于a
int p1=l;
int p2=mid+1;
int k=0;
while(p1<=mid&&p2<=r){
if(a[p1]<=a[p2])
help[k++]=a[p1++];
else
help[k++]=a[p2++];
}
//下面两个循环只能运行一个,
while(p1<=mid){
help[k++]=a[p1++];
}
while(p2<=r){
help[k++]=a[p2++];
}
for(int n=0;n<(r-l+1);n++) //将help中的数据copy到a中
a[l+n]=help[n];
free(help);
}
void merge_sort(int a[],int l,int r)
{
if(l!=r){
int mid=(l+r)/2;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
merge(a,l,r,mid);
}
}
void mergesort(int a[],int l,int r)
{
merge_sort(a,l,r-1);
}
int main()
{
int size,i;
printf("请输入要创建的数组长度:\n");
scanf("%d",&size);
int *a = (int*)malloc(size*sizeof(int));
//根据需求动态创建数组
//int a[8],i;
printf("输入长度为%d的数组\n",size);
for(i=0;i<size;i++)
scanf("%d",&a[i]);
mergesort(a,0,size);
for(i=0;i<size;i++)
printf("%d ",a[i]);
return 0;
}
3.运行结果
4.算法复杂度分析
设调用mergesort的执行时间为T(n),由执行过程可知以下递归关系,
T(n)=O(1) 当n=1
T(n)=2T(n/2)+O(n)
其中O(n)为merge所需的时间,设cn(c为正常量)。因此
T(n)=2T(n/2)+cn=2(2T(n/4) +cn/2)+cn=2^2T(n/4)+2cn
=23T(n/23)+3cn
…
=2kT(n/2k)+kcn
=nO(1)+cnlog2n=n+cnlog2n
=O(nlog2n)