快速排序的逻辑是,若要对 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);
}
归并排序的逻辑,若要对 nums[lo..hi]进⾏排序,我们先对 nums[lo..mid]排序,再对nums[mid+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);
/************************/
}
先构造分界点,然后去左右⼦数组构造分界点,你看这不就是⼀个⼆叉树的前序遍历吗。先对左右⼦数组排序,然后合并(类似合并有序链表的逻辑),你看这是不是⼆叉树的后序遍历框架