做购物网站流程,充电网站建设方案,设计公司职位,WordPress添加看板娘#x1f397;️ 主页#xff1a;小夜时雨 #x1f397;️专栏#xff1a;快速排序 #x1f397;️如何活着#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析
题目链接: https://leetcode.cn/problems/sort-an-array/ 我们上道题讲过快速排序的核心代码️ 主页小夜时雨 ️专栏快速排序 ️如何活着是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析
题目链接: https://leetcode.cn/problems/sort-an-array/ 我们上道题讲过快速排序的核心代码建议先看一下这道题颜色分类 https://leetcode.cn/problems/sort-colors/description/
快速排序的核心代码区间就是数组分三块, 所以还是十分重要的, 接下来我们再来分析一下分块这个过程
i 作为基准 key , 用三个变量分别标记, i 标记遍历原数组的位置, left 标记 0 区域的最右边位置, right 标记右边 2 区域最左边的位置.i 遍历数组, nums[i] key 时, 交换 left 1 和 i 位置的值, i;碰见 key 的, 直接 i;nums[i] key 时, 交换 right - 1 和 i 位置的值, 此时注意没有 i, 仍要进行判断 i 位置的值(详情看颜色分类这道题: https://leetcode.cn/problems/sort-colors/description/
接下来我们来说一下快速排序的实现过程
快速排序具体实现过程
首先我们先确定一个 key作为基准进行比较.三个变量进行标记, 分别是 i 标记原数组遍历的位置, left 标记 key 区域的最右边位置, right 标记 key 区域的最左边位置.i 遍历原数组, nums[i] key 时, 交换 left 1 和 i 位置的值, 之后 i, left;nums[i] key 时, i, 不做任何交换nums[i] key 时, 交换 right - 1 和 i 位置的值, 之后 right - 1, 注意 i 不变这个之后把数组分成了三块, 中间一块都是等于 key 的不用处理, 之后递归处理左边区域和右边区域, 也都是同样的处理方式, 就是递归. (看后续的代码更容易理解).
看下面的分析图可能会更容易理解 关于 key 的选择, 我们用随机的方式选择基准元素最好, 分三块的思想当全部元素都一样的时候, 此时只需遍历一遍就可以排好数组了. 也就是说我们想让整体有序先把数组分为三块, 左边是小于 key 的区域, 中间是等于 key 的区域, 右边是大于 key 的区域. 这样是一个大致有序的数组了以左区间为例得先让左区间进行有序让左区间有序就得让左区间进行划分, 分成三块, 之后左边区间又逐渐有序了.就这样一直划分下去直到划分不了区间就是有序了, 那么这个时候左边区间就是已经排好序了, 右边区间同理.我们发现这个过程其实有点像是二叉树的前序遍历, 前让中间区域有序(类比是根节点), 之后再是左区间, 右区间有序.归并排序有点像是二叉树的后序遍历左右区间有序之后类比先遍历左右子树合并之后整体才会有序遍历根节点。
2. 代码
看下面的代码对照着上面的流程解析可能会更加的清楚。 // 快速排序public int[] sortArray3(int[] nums) {int n nums.length;// 传入下标qsort(nums, 0, n - 1);return nums;} /*** l r 表示下标 要排序的下标* * param nums* param l* param r*/private void qsort(int[] nums, int l, int r) {// 循环终止条件if(l r) return;// 数组分三块, 不是从 0 开始 因为要划分好多次// left 表示小于 key 的最右侧 right 表示大于 key 的最左侧int left l - 1, right r 1, i l;// 随机生成 key, 注意这个位置 nextInt(r - l 1) l 别忘了加 lint key nums[new Random().nextInt(r - l 1) l];// 数组分三块 核心代码while(i right) {if(nums[i] key) swap(nums, i, left);else if (nums[i] key) i;else swap(nums, i, --right);}// 分完之后 再分左侧的和右侧的qsort(nums, l, left);qsort(nums, right, r);}private void swap(int[] nums, int i, int j) {int temp nums[i];nums[i] nums[j];nums[j] temp;}
归并排序: https://blog.csdn.net/Jin__Wang/article/details/139811604 ️️️ 好啦到这里有关本题的分享就没了如果感觉做的还不错的话可以点个赞关注一下你的支持就是我继续下去的动力我们下期再见拜了个拜~ ☆*: .. o(≧▽≦)o ..:*☆