每天一算法,我是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)
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)
相关文章推荐
- 每天一个小算法(1)----合并两个已经排序的数组
- 每天一道算法题——合并两个排序的链表
- 校招准备系列:每天一道算法题(14)-合并两个排序的链表
- 每天一道算法题(16)——合并已排序的链表
- 每天一道算法题(16)——合并已排序的链表
- 算法题--合并两个排序的链表
- 面试算法(十六)合并两个排序的链表
- 每天一算法(把二元查找树转变成排序的双向链表 )
- 设计一个算法将两个字符串合并按字母排序
- 各种算法的C#实现系列1 - 合并排序的原理及代码分析
- 【每天算法3】:用java语言实现,二维Vector的排序组合
- 设计一个算法将两个字符串合并按字母排序
- 算法(分治)合并排序和快速排序
- 算法导论2.4 合并排序求逆序数
- 算法研究之合并两个已排序的数组java版
- 普通表的Join 三种算法(join 一) 嵌套循环Join(Nested Loops Join)、排序合并Join(Sort-Merge Join)和哈希Join(Hash Join)
- 【算法导论】 2.3合并排序
- 【每天一道算法题】时间复杂度为O(n)的排序
- 设计一个算法将两个字符串合并按字母排序
- 老老实实复习算法: 3 合并排序