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; 
} 

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

相关文章
归并排序及其非递归实现
归并排序及其非递归实现
41 0
|
1月前
|
算法
非递归实现后序遍历的时间复杂度是多少?
虽然非递归实现后序遍历的时间复杂度与递归实现相同,但在空间复杂度和一些特定场景下的性能表现等方面可能会有所不同,具体使用哪种方式还需要根据实际情况进行权衡。
|
1月前
|
存储
非递归实现后序遍历的空间复杂度是多少?
综上所述,非递归实现后序遍历的空间复杂度在不同实现方式下有所不同,但总体上与二叉树的高度相关,最坏情况下为 $O(n)$,最好情况下为 $O(\log_2 n)$。
|
7月前
|
算法
递归算法实现二分查找
本文简要介绍了递归实现的二分查找算法,这是一种在有序列表中快速查找的策略。递归方法虽在实际应用中较少,但有助于理解递归思想,为学习数据结构中的树内容打下基础。文中提供了原版和递归版本的二分查找代码,并强调了递归算法中处理未找到情况的注意事项。此外,还提到了递归在解决复杂问题时的优势,并通过链接分享了一个关于递归实现素数判断的例子。
106 2
|
6月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
45 0
|
7月前
|
算法 索引
【数据结构与算法】:非递归实现快速排序、归并排序
上篇文章我们详细讲解了递归版本的快速排序,本篇我们来探究非递归实现快速排序和归并排序
【数据结构与算法】:非递归实现快速排序、归并排序
|
7月前
快速排序详解(递归实现与非递归实现)
快速排序详解(递归实现与非递归实现)
|
7月前
|
存储 搜索推荐
【非递归版】快速排序算法(4)
【非递归版】快速排序算法(4)
53 0
|
7月前
|
搜索推荐 C++
【非递归版】归并排序算法(2)
【非递归版】归并排序算法(2)
63 0
|
7月前
|
搜索推荐 算法
排序算法——归并排序(递归与非递归)
排序算法——归并排序(递归与非递归)