归并排序,递归与非递归

递归:

 1 void merge_array(int a[],int low,int mid,int end){
 2     int* temp =  new int[end-low+1];
 3     int index_pre = low;
 4     int index_post = mid+1;
 5     int i=0;
 6     while(index_pre<=mid&&index_post<=end){
 7         if(a[index_pre]<a[index_post])
 8             temp[i++] = a[index_pre++];
 9         else
10             temp[i++] = a[index_post++];
11     }
12     if(index_pre<=mid)while(index_pre<=mid)
13             temp[i++] = a[index_pre++];
14     if(index_post<=end)while(index_post<=end)
15             temp[i++] = a[index_post++];
16     for(i=0;i<end-low+1;i++)
17         a[low+i] = temp[i];
18     delete[] temp;
19 }
20
21 void merge_sort(int a[],int low, int high){
22     if(low<high){
23         int mid = (low+high)/2;
24         merge_sort(a,low,mid);
25         merge_sort(a,mid+1,high);
26         merge_array(a,low,mid,high);
27     }
28 }                

非递归:

即以1,2,4,8...为间隔对数组进行归并,需要用到额外的空间。空间复杂度是O(n),时间复杂度为O(nlogn)。

 1 void mergeArray2(int a[],int b[], int low,int mid,int high){
 2     int i=low,j=mid+1,k=i;
 3     while(i<=mid&&j<=high){
 4         if(b[i]<b[j]){
 5             a[k++]=b[i++];
 6         }else{
 7             a[k++]=b[j++];
 8         }
 9     }
10     while(j<=high)
11         a[k++]=b[j++];
12     while(i<=mid)
13         a[k++]=b[i++];
14 }
15 void mergepass(int a[],int b[],int s,const int length){
16     int i=0;
17     while(i<=length-2*s){
18         mergeArray2(a,b,i,i+s-1,i+2*s-1);
19         i = i+2*s;
20     }
21     if(i+s<length)mergeArray2(a,b,i,i+s-1,length-1);
22     else for(int j=i;j<length;j++)a[j]=b[j];
23 }
24 void mergeSort(int temp[],const int length){
25     int i=0;
26     int s=1;
27     int* temp1= new int[length];
28     while(s<length){
29         mergepass(temp1,temp,s,length);
30         s*=2;
31         mergepass(temp,temp1,s,length);
32         s*=2;
33     }
34     delete[] temp1;
35 }
时间: 2024-10-22 22:04:37

归并排序,递归与非递归的相关文章

算法之归并排序的递归与非递归的实现

一.什么是归并排序 归并排序就是将多个有序的数据段合成一个有序的数据段,如果参与合并的只有两个有序的数据段,则称为二路归并.与快速排序和堆排序相比,其最大的特点是一种稳定的算法,算法的平均时间复杂度O(nlog2n). 二.归并排序的基本思路 (1).对于一个原始的待排序表,可以将R[1]到R[n]可以看做是n个长度为1的有序表,即分解. (2).进行第一趟归并,即将上述的n个子序两两合并,得到 n/2向上取整 个有序表,若n为奇数,则归并到最后一个子序列长度为1,即合并. (3).再将两个 n

归并排序(递归、非递归、以及自然归并排序)算法总结

注:本文所指归并排序指 二路归并排序. 归并排序是平均情况.最坏情况.最好情况时间复杂度都为O(Nlog2N)的稳定的排序算法.最近梳理了下归并排序的递归.非递归.以及自然归并排序算法. 归并排序的基础:将两个有序数组合并为一个有序数组,需要O(n)的辅助空间. 图片来自:https://www.cnblogs.com/chengxiao/p/6194356.html // array:待排序数组 //temparray: 临时数组 //startindex:起始下标 //middleindex

数据结构——二叉树遍历之“递归与非递归遍历”

简述 二叉树的遍历分为先序遍历.中序遍历和后序遍历.如下图所示: 递归遍历 private void bianli1(List<Integer> list, TreeNode root) { // 先序遍历 if (root == null) { return; } list.add(root.val); bianli1(list, root.left); bianli1(list, root.right); } private void bianli2(List<Integer>

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

二叉树遍历递归与非递归实现

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二叉树遍历是二叉树中非常基础的部分,也是学习二叉树必须熟练掌握的部分,下面我们先给出二叉树三种遍历方式的定义,并通过举例来说明二叉树遍历的过程. 二叉树的遍历分为:前序遍历(也叫先序遍历).中序遍历.后序遍历.所谓前.中.后都是根据当前子树根结点相对左右孩子的位置而言,也就是说: 前序遍历:根结点在前,即:根 ----->左------->右: 中序遍历:根结点在中间,即:左------>根------>右: 后序遍历:根结点在最

树的递归与非递归遍历总结

树的递归遍历遍历很简单,非递归遍历要复杂一些,非递归先序.中序.后序遍历需要用一个辅助栈,而层次遍历则需要一个辅助队列. 树的结构: 1 public class Tree<T> { 2 private T data; 3 private Tree<T> left; 4 private Tree<T> right; 5 ... 6 } 用策略模式定义一个访问工具: 1 public interface Visitor<T> { 2 void process(

全排列(递归与非递归实现)

全排列问题在公司笔试的时候很常见,这里介绍其递归与非递归实现. 递归算法 1.算法简述 简单地说:就是第一个数分别以后面的数进行交换 E.g:E = (a , b , c),则 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b) 然后a.perm(b,c)= ab.perm(c)+ ac.perm(b)= abc + acb.依次递归进行. void swap(string &pszStr,int k,int m) { if(k==m) return ;

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

二叉树遍历算法总结(递归与非递归)

一:前言 二叉树的遍历方法分四种:前序,中序,后序以及层次遍历. 其中,前中后遍历方法的实现分递归和非递归,非递归遍历的实现需要借助于栈. 实际上,递归的调用就是一种栈的实现,所以,非递归遍历就需要人工借助栈结构来实现. 而层次遍历需要借助队列. 二:前中后序遍历 递归遍历: 递归遍历的思想和方法很简单,通过调整输出语句来实现前,中,后三种遍历. 代码如下: 1 void show(BiTree T) 2 { 3 if(T) 4 { 5 printf("%c ",T->data)