2-路归并排序的递归实现和非递归实现

简介: 2-路归并排序的递归实现和非递归实现

2-路归并排序当时考研时在严书上看到的是递归算法,实际上可能非递归算法效率更高,现在把两者都写出来:


#include <iostream>
#include<algorithm>
using namespace std;
const int maxn=101;
int t[maxn];
void merge(int a[],int l1,int r1,int l2,int r2) {
  //将相邻两区间合并,l2=r1+1
  int i=l1,j=l2,k=0;
  while(i<=r1&&j<=r2){
    if(a[i]<=a[j])
      t[k++]=a[i++];
    else
    t[k++]=a[j++];    
  }
  while(i<=r1)t[k++]=a[i++];
  while(j<=r2)t[k++]=a[j++];
  for(int m=l1,f=0;m<=r2;) 
  a[m++]=t[f++];
}
void mergesort(int a[],int left,int right) {          //递归实现 
  if(left<right){
    int mid=(left+right)/2;
    mergesort(a,left,mid);
    mergesort(a,mid+1,right);
    merge(a,left,mid,mid+1,right);  
  } 
}
void mergesortnot(int a[],int n) {                   //非递归实现 
  for(int step=2;step/2<n;step*=2) {
    for(int i=0;i<n;i+=step)
    {
      int mid=i+step/2-1;
      if(mid+1<n)
      merge(a,i,mid,mid+1,min(i+step-1,n-1));   
    }
  }
}
int main(){
    int a[6]={5,7,6,8,3,1};
  mergesort(a,0,5);
  for(int i=0;i<6;i++)
  cout<<a[i]<<" ";
  cout<<endl; 
   int b[6]={5,7,6,8,3,1};
  mergesortnot(b,6);
  for(int i=0;i<6;i++)
  cout<<b[i]<<" ";
  cout<<endl; 
  return 0; 
} 

上述原理都在归并,不过递归是自上而下思考,非递归实现是自下向上思考

相关文章
归并排序及其非递归实现
归并排序及其非递归实现
38 0
|
5月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
37 0
|
6月前
|
算法
递归算法实现二分查找
本文简要介绍了递归实现的二分查找算法,这是一种在有序列表中快速查找的策略。递归方法虽在实际应用中较少,但有助于理解递归思想,为学习数据结构中的树内容打下基础。文中提供了原版和递归版本的二分查找代码,并强调了递归算法中处理未找到情况的注意事项。此外,还提到了递归在解决复杂问题时的优势,并通过链接分享了一个关于递归实现素数判断的例子。
93 2
|
6月前
|
存储 搜索推荐
【非递归版】快速排序算法(4)
【非递归版】快速排序算法(4)
44 0
|
6月前
|
搜索推荐 C++
【非递归版】归并排序算法(2)
【非递归版】归并排序算法(2)
54 0
|
6月前
|
搜索推荐 算法
排序算法——归并排序(递归与非递归)
排序算法——归并排序(递归与非递归)
|
6月前
|
搜索推荐 算法
排序算法:归并排序(递归和非递归)
排序算法:归并排序(递归和非递归)
69 0
|
算法 搜索推荐
归并排序含非递归版
归并排序含非递归版
|
存储
快速排序(非递归)
快速排序(非递归)
126 0
|
搜索推荐 算法
归并排序(递归+非递归)
归并排序(递归+非递归)