您的位置:首页 > 其它

每天一算法,我是IT人生 --合并排序

2012-04-18 23:01 218 查看
上篇学习了插入算法,这是一种增量方法以,这篇学习的是分治法中的一种。

2.合并排序

void merge( int *a,int startnum,int midnum,int endnum )

{

int n1 = midnum - startnum + 1;

int n2 = endnum - midnum ;

int *a1 = (int *)malloc((n1+1)*sizeof(int));

int *a2 = (int *)malloc((n2+1)*sizeof(int));

for( int i=0;i<n1;++i) a1[i] = a[startnum+i];

for( int i=0;i<n2;++i) a2[i] = a[midnum+1+i];

a1[n1] = 100000;//这里理论上是无究大值,这里只给了一个较大的数据

a2[n2] = 100000;

int i=0;

int j=0;

for( int k= startnum;k<=endnum;++k)

{

if( a1[i]<=a2[j])

{

a[k] = a1[i];

++i;

}

else

{

a[k] = a2[j];

++j;

}

}

free(a1);

free(a2);

}

void merge_sort( int *a,int startnum,int endnum )

{

if( startnum < endnum )

{

int q = ( startnum+endnum )/2;

merge_sort( a,startnum,q);

merge_sort( a,q+1,endnum );

merge(a,startnum,q,endnum );

}

}

时间复杂度:

测试10000个范围(0,100)的随机数值,结果如下:

实际值:

合并排序: 插入排序:

starttime1.437s starttime1.421s

endtime1.468s endtime1.593s

using time0.031s using time0.172s

理论值:

O( nlogn ) O(n2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: