關於遞歸調用的問題

今天仍是對快速排序和歸併排序有些困惑。特別是有兩個遞歸調用出現時,很迷糊。java

在只有一個遞歸調用時,將沒有執行的內容壓入棧底,而後出棧。dom

例子:spa

testRecursion1.javacode

package recursion;

public class testRecursion1 {
    public static void main(String[] args) {
        int num=3;
        recursion(num);
    }
    private static void recursion(int n){
        n=n+1;
        if(n<7){
            recursion(n)
            System.out.println(n);
        }
    }
}

可是在兩個遞歸調用的時候,棧就很差使了。在諮詢大神以後,發現用樹是比較通用的。blog

將上述testRecursion.java繪製成樹:排序

而後對這棵樹進行 「後序遍歷」。遞歸

當有兩個遞歸的時候:io

例子testRecursion2.javaclass

package recursion;

public class testRecursion2 {
    public static void main(String[] args) {
        int num=3;
        recursion(num);
    }
    private static void recursion(int n){
        n=n+1;
        if(n<7){
            recursion(n);
            recursion(n);
            System.out.println(n);
        }
    }
}

其運行以後的結果是6 6 5 6 6 5 4test

樹的形狀:

順便看看昨天的歸併排序(快速排序相似):

MergeSort.java
public class MergeSort {
    public static void main(String[] args) {
        long begin = System.nanoTime();
        int[] a=new int[10000];
        for(int len=0;len<a.length;len++){
            int temp =  (int)(Math.random()*100)+1;
            a[len]=temp;
        }
        mergesort(a,0,a.length-1);
        long end = System.nanoTime();
        for(int i:a)
            System.out.print(i+"\t");
        System.out.print("\n");
        System.out.print((end-begin)+"ns");
    }
    private static void mergesort(int[] a,int left,int right){
        int mid=(right+left)/2;
        if(left<right){
            mergesort(a,left,mid);
            mergesort(a,mid+1,right);
            merge(a,left,mid,right);
        }
    }
    private static void merge(int[] a,int left,int mid,int right){
        int[] c=new int[a.length];
        int i=left,j=mid+1,t=left;
        while(left<=mid&&j<=right){
            if(a[left]<=a[j]){
                c[t++]=a[left++];
            }
            else{
                c[t++]=a[j++];
            }
        }
            while(j<=right){
                c[t++]=a[j++];
            }
            while(left<=mid){
                c[t++]=a[left++];
            }
        
             while (i <= left) {  
                    a[i] = c[i++];  
                }  
    }
}

其樹形:

 

將樹形列出以後,進行「後續遍歷」便可得出結果!!

相關文章
相關標籤/搜索