快速排序就是二叉樹的前序遍歷,歸併排序就是個二叉樹的後序遍歷。
快速排序的邏輯是,若是要對nums[lo...hi]進行排序,咱們先找一個分界點p,經過交換元素使得nums[lo...p-1]都小於等於nums[p],且nums[p+1...hi]都大於nums[p],而後遞歸地去nums[lo...p-1]和nums[p+1...hi]中尋找新的分界點,最後整個數組就被排序了。
快速排序的代碼框架以下算法
void sort(int[] nums,int lo,int hi){ //前序遍歷位置 //經過交換元素構建分界點p int p=partition(nums,lo,hi); sort(nums,lo,p-1); sort(nums,p+1,hi); }
歸併排序的代碼框架以下數組
void sort(int[] nums,int lo,int hi){ int mid=(lo+hi)/2; sort(nums,lo,mid); sort(nums,mid+1,hi); //後序遍歷位置 //合併兩個排好序的子數組 merge(nums,lo,mid,hi); }
寫遞歸算法的關鍵是要明確函數的 定義 是什麼,而後相信這個定義,利用這個定義推導出最終的結果,毫不要跳入遞歸的細節。框架
//定義:count(root)返回以root爲根的樹有多少節點 int count(TreeNode root){ //base case if(root==null){ return 0; } return 1+count(root.left)+count(root.right); }