快速排序就是二叉树的前序遍历,归并排序就是个二叉树的后序遍历。
快速排序的逻辑是,若是要对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); }