当前位置: 首页 > news >正文

网站的关键字 设置平果县免费网站哪家好

网站的关键字 设置,平果县免费网站哪家好,郴州市网站建设公司,深圳专业高端网站建设费用🎗️ 主页:小夜时雨 🎗️专栏:快速排序 🎗️如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/sort-an-array/ 我们上道题讲过快速排序的核心代码&a…

🎗️ 主页:小夜时雨
🎗️专栏:快速排序
🎗️如何活着,是我找寻的方向

优雅

目录

  • 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/

接下来我们来说一下快速排序的实现过程

快速排序具体实现过程:

  1. 首先我们先确定一个 key,作为基准进行比较.
  2. 三个变量进行标记, 分别是 i 标记原数组遍历的位置, left 标记 < key 区域的最右边位置, right 标记 > key 区域的最左边位置.
  3. i 遍历原数组, nums[i] < key 时, 交换 left + 1 和 i 位置的值, 之后 i++, left++;
  4. nums[i] == key 时, i++, 不做任何交换
  5. nums[i] > key 时, 交换 right - 1 和 i 位置的值, 之后 right - 1, 注意 i 不变
  6. 这个之后把数组分成了三块, 中间一块都是等于 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 .。.:*☆

http://www.yayakq.cn/news/536737/

相关文章:

  • 股票网站建设官方网站建设的四个步骤
  • 海口网站建设就q479185700上墙优化公司排行榜
  • 志迅东莞网站建设app推广代理平台
  • 老网站不要了做新站需要怎么处理找深圳做网站的公司
  • 做php门户网站那个系统好想做一个电影网站该怎么做
  • 汕头网站推广seo小白建站软件
  • 个人公众号做电影网站吗在哪里建立个人网站
  • 景县住房和城乡规划建设局网站宣传片拍摄制作多少钱
  • c2c网站有哪些?开远市住房和城乡建设局网站
  • 网站架构技术免费php mysql网站
  • 设计制作网站板面网站备案信息注销
  • 衡水网站seowordpress移动顶部菜单
  • 成都天府新区网站建设logo设计一键生成
  • 高端网站特色dw做网站是静态还是动态
  • 做网站服务器哪种好wordpress如何添加备案号代码
  • 无经验可以做网站编辑吗什么是门户网
  • a站免费最好看的电影片推荐wordpress插件 开发
  • aap手机网站建设海南电商网站建设
  • 做公司网站注意什么wordpress 仪表盘
  • 火车票网站建设wordpress移动端顶部菜单
  • 响应式公司网站python编写简单网页
  • 济南网站建设培训班最新的网站建设软件
  • 深圳网站制作公司售后服务网站建设的本质
  • 辽宁省建设工程招投标协会网站如何说服别人做网站
  • 电子商务的网站建设名词解释网站开发去哪学
  • 排版网站推荐兰州网站建设招聘最新
  • 安徽建站之星出格做网站怎么样
  • 网站案例分析2021年有没有人给个网站
  • 网站被很多公司抄袭网站建设的成功之处有哪些
  • 做木材生意的外贸网站云免网站空间