二路归并排序
2016-12-18 21:45
274 查看
二路归并排序是将两个有序表合并成一个有序表的排序方法。
其基本思想为:序列中有n个记录,可以看作为n个有序子序列,每个序列长度为1。首先将每相邻的两个记录合并,得到┌n/2┒个较大的有序子序列,每个序列长度为2。再将上述子序列两两合并,得到┌┌n/2┒/2┒个有序子序列,直至得到一个长度为n的有序序列为止,排序结束。
二楼归并排序的算法如下:
void Merge(List a,List R,int h,int m,int n)
{
k=h;j=m+1;
while((h<=m)&&(j<n))
{
if(a[h].key<=a[j].key)
{
R[k]=a[h];
h++;
}
else{
R[k]=a[j];
j++;
}
k++;
}
while (h<=m)
{
R[k]=a[h];
h++;
k++;
}
while (j<=n)
{
R[k]=a[j];
j++;
k++;
}
}
归并排序算法的时间复杂度为O(nlog2n),当n较大时,归并排序的时间性能优于堆排序,但是它所需的存储量较多。
其基本思想为:序列中有n个记录,可以看作为n个有序子序列,每个序列长度为1。首先将每相邻的两个记录合并,得到┌n/2┒个较大的有序子序列,每个序列长度为2。再将上述子序列两两合并,得到┌┌n/2┒/2┒个有序子序列,直至得到一个长度为n的有序序列为止,排序结束。
二楼归并排序的算法如下:
void Merge(List a,List R,int h,int m,int n)
{
k=h;j=m+1;
while((h<=m)&&(j<n))
{
if(a[h].key<=a[j].key)
{
R[k]=a[h];
h++;
}
else{
R[k]=a[j];
j++;
}
k++;
}
while (h<=m)
{
R[k]=a[h];
h++;
k++;
}
while (j<=n)
{
R[k]=a[j];
j++;
k++;
}
}
void MergePass(List a,List b,int h) { i=1; while(i<n-2*h+1) { merge(a,b,i,i+h-1,i+2*h-1); i+=2*h; } if(i+h-1<n) merge(a,b,i,i+h-1,n); else for(t=i;t<=n;t++) b[t]=a[t]; }
void MergeSort(List a,int n) { m=1; while(m<n) { MergePass(a,b,n,m); m=2*m; MergePass(b,a,n,m); m=2*m; } }
归并排序算法的时间复杂度为O(nlog2n),当n较大时,归并排序的时间性能优于堆排序,但是它所需的存储量较多。
相关文章推荐
- 归并排序--二路归并
- 经典排序之二 快速排序 + 二路归并
- C++ 二路归并排序
- 归并排序——二路归并排序
- 归并排序、二路归并排序
- 二路归并排序及数组中逆序对的计算
- 二路归并排序,利用递归,时间复杂度o(nlgn)
- 二路归并排序Python实现
- 二路归并排序
- 微软笔试题 大型文件外部排序(二路归并和k路归并的实现和比较)
- 二路归并排序
- 二路归并排序
- Linux C学习笔记-排序算法6-二路归并排序
- MIT:算法导论——1.算法分析——插入排序 vs 二路归并排序
- 二路归并非递归排序Java实现
- 二路归并排序
- 二路归并排序
- 二路归并排序及其改进方法
- 二路归并排序_2011_10_11
- 数据结构 二路归并排序的实现