当前位置: 首页 > 后端技术 > Java

快速排序和归并排序怎么理解

时间:2023-04-01 19:05:57 Java

快速排序其实就是二叉树的前序遍历,而归并排序其实就是二叉树的后序遍历。快排的逻辑是,如果我们要对nums[lo..hi]进行排序,首先找到一个分界点p,交换元素使得nums[lo..p-1]小于等于nums[p],并且nums[p+1..hi]大于nums[p],然后递归到nums[lo..p-1]和nums[p+1..hi]寻找新的划分点,最后整理出整个数组。快速排序的代码框架如下:voidsort(int[]nums,intlo,inthi){/******前序遍历位置******///构建分界点pint通过交换元素p=partition(nums,lo,hi);/************************/sort(nums,lo,p-1);sort(nums,p+1,hi);}先构造分界点,再去左右子数组构造分界点,你不觉得这是二叉树的前序遍历吗?下面说一下归并排序的逻辑。.hi]来排序,我们先对nums[lo..mid]进行排序,然后对nums[mid+1..hi]进行排序,最后合并这两个有序的子数组,整个数组就排序好了。归并排序的代码框架如下:voidsort(int[]nums,intlo,inthi){intmid=(lo+hi)/2;//排序nums[lo..mid]sort(nums,lo,mid);//排序nums[mid+1..hi]sort(nums,mid+1,hi);/******后序位置******///合并nums[lo..mid]和nums[mid+1..hi]merge(nums,lo,mid,hi);/*********************/}先对左右子数组排序,然后合并(类似于合并有序链表的逻辑),你以为这是二叉树的后序遍历框架?另外,这不就是传说中的分治算法吗?不过说了这么多,说明二叉树的算法思想被广泛使用。甚至可以说,只要涉及到递归,就可以抽象成一个二叉树问题。