上篇学习了插入算法,这是一种增量方法以,这篇学习的是分治法中的一种。
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)