您的位置:首页 > 其它

归并排序算法及分析

2016-02-29 14:52 162 查看
#include"iostream"

#include"cstdio"

#define inf 9999999 //注意inf代表监视哨,在从小到大排序时,监视哨是做当前条件下的无限大值,否则,监视哨用作当前环境下的绝对最小值

using namespace std;

//小心当数组不是全局变量的时候,完全可以用指针实现相应的功能

int a[]={0,449,31,41,59,26,41,2,58};

int num=8;

void merge(int a[],int p,int centre,int r) //merge函数不仅对两个子块进行了排序,还对其进行了合并O(n)的时间内;

{

int i,j;

int n1=centre-p+1;

int n2=r-centre;

int x[n1+2];

int y[n2+2];

for(i=1;i<=n1;i++)

{

x[i]=a[p+i-1];

}

for(j=1;j<=n2;j++)

{

y[j]=a[centre+j];

}

x[n1+1]=y[n2+1]=inf;

i=j=1;

for(int k=p;k<=r;k++) //上面提到监视哨,在循环遍历的时候,如果其中一个数组提前为空,监视哨暂时代替空数组对另一个数组进行判断

{ //保证剩下的数组的各元素依序添加到数组段中

if(x[i]<y[j])

{

a[k]=x[i];

i++;

}

else

{

a[k]=y[j];

j++;

}

}

}

void merge_sort(int a[],int p,int r)

{

int centre;

centre=(p+r)/2;

if(p<r)

{

merge_sort(a,p,centre);

merge_sort(a,centre+1,r);

merge(a,p,centre,r);

}

}

int main()

{

merge_sort(a,2,4);

for(int i=1;i<num;i++)

{

printf("%d ",a[i]);

}

printf("%d\n",a[num]);

return 0;

}

相对于插入排序个人觉得有个优点就是:

1.我们可以对数组的一个段而不是全部进行排序,排序的方式更加灵活

2.当输入数据较大的时候,归并排序的运行比插入排序能快

算法复杂度分析:

首先归并排序算法是一种递归分治的算法,有一般的分析方式(输入为n)

原子最小子问题 a=O(1);

总时间 T(n)=ab+D(n)+C(n);

(以上a代表求解一个最小子问题需要的时间,b代表分了子问题的数目,D代表分解问题需要的总时间,C代表合并子问题需要的时间);

归并排序算法分析:(本人对于主定理没有了解,浅浅的表示一下归并算法的增长速度在大数如下要小得多)

T(n)=O(1) n=1;

T(n)=2*T(n/2)+O(n) n>1;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: