今天仍是對快速排序和歸併排序有些困惑。特別是有兩個遞歸調用出現時,很迷糊。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++]; } } }
其樹形:
將樹形列出以後,進行「後續遍歷」便可得出結果!!