归并排序算法及分析

来源:互联网 发布:巨人网络借壳方案 编辑:程序博客网 时间:2024/06/05 02:11
#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;

1 0
原创粉丝点击