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

婚纱网站排行成都软件外包开发

婚纱网站排行,成都软件外包开发,怎么去建设微信网站,泰安千橙网络科技有限公司由于之前做有一题看到题解用了快排提升效率#xff0c;就浅学了一下快速排序#xff0c;还是似懂非懂。 首先快排的核心有两点#xff0c;哨兵划分和递归。 哨兵划分#xff1a;以数组中的某个数#xff08;一般为首位#xff09;为基准数#xff0c;将数组划分为两个部… 由于之前做有一题看到题解用了快排提升效率就浅学了一下快速排序还是似懂非懂。 首先快排的核心有两点哨兵划分和递归。 哨兵划分以数组中的某个数一般为首位为基准数将数组划分为两个部分小于基准数的都在左部分大于基准数的都在右部分。也就是说此时基准数的位置已经正确了递归除了基准数已经处于正确位置其他两部分还需要继续递归执行哨兵划分当划分到子数组长度都为 1 了那就没什么好划分的了说明此时数组已经排序完了。示例代码如下 // 递归部分// lr子数组左右边界public void quickSort(int[] nums, int l, int r){// 说明数组长度被划分到此时为 1 了if(lr)return;// i 为基准数坐标此时 i 左部分都小于 nums[i]右部分大于 nums[i]int ipartition(nums, l, r);// 对左右两部分递归执行哨兵划分quickSort(nums,l,i-1);quickSort(nums,i1,r);}// 哨兵划分int partition(int[] nums, int l, int r) {int il, jr;while(ij){// 先从右边往前找比基准数小的这个 ij 的作用是// 首先不会数组越界其次它保证了不会出现错误的交换// 因为 i 左边的都是划分完的j 右边的也都是划分完的不应该再变动while(i j nums[j] nums[l]) j--;// 再从左边往后找比基准数大的while(i j nums[i] nums[l]) i;// 然后把小的换到左边大的换到右边swap(nums, i, j);}// 因为此时大致为// l i j// 中 小 小 大 大// 所以最后还需要把基准数移到正确的位置swap(nums, i, l);return i;}// 交换 nums[i] 和 nums[j]void swap(int[] nums, int i, int j) {int tmp nums[i];nums[i] nums[j];nums[j] tmp;}时间复杂度的话不难看出哨兵划分操作是 O(N)递归是递归 logN 轮所以时间复杂度 O(logN) ,所以总共是 O(N logN)最差情况下每次哨兵划分都划分出 N-1 长度的数组以及长度 1 的数组那时间复杂度就为 O(N2) 了空间复杂度的话递归深度最好的情况平均情况下都是 logN数组完全倒序让你排成正序那深度就为 N 了 算法优化 快排常见优化手段有「Tail Call」和「随机基准数」两种 Tail Call 上面也说了因为是选取最左边的数为基准数所以如果数组完全倒序那么递归深度就会达到 N也就是说最差空间复杂度为 O(N) 每轮递归时仅对 较短的子数组 执行哨兵划分 partition() 就可将最差的递归深度控制在 O(logN) 每轮递归的子数组长度都 ≤ 当前数组长度 / 2即实现最差空间复杂度 O(logN) 那么只需要修改 quickSort 部分即可 void quickSort(int[] nums, int l, int r) {// 子数组长度为 1 时终止递归while (l r) {// 哨兵划分操作int i partition(nums, l, r);// 仅递归至较短子数组控制递归深度if (i - l r - i) {quickSort(nums, l, i - 1);l i 1;} else {quickSort(nums, i 1, r);r i - 1;}}}随机基准数 由于每次都是取数组首位为基准数所以当数组完全有序或完全倒序时partition() 每次都是只划分了一个元素。也就是说当前情况下选择首位为基准数是最差的选择但是我们仍然每次都坚定选择了最差的选择。 那么使用随机函数 每轮在子数组中随机选择一个元素作为基准数就可以极大概率避免以上劣化情况。 值得注意的是由于仍然可能出现最差情况运气真的差到极点每次都随机到首位跟不随机一样因此快速排序的最差时间复杂度仍为 O(N2) 。 代码仅需修改 partition() 方法其余方法不变在此省略。这个就很好理解了 int partition(int[] nums, int l, int r) {// 在闭区间 [l, r] 随机选取任意索引并与 nums[l] 交换int ra (int)(l Math.random() * (r - l 1));swap(nums, l, ra);// 以 nums[l] 作为基准数int i l, j r;while (i j) {while (i j nums[j] nums[l]) j--;while (i j nums[i] nums[l]) i;swap(nums, i, j);}swap(nums, i, l);return i;}参考原文
http://www.yingshimen.cn/news/27493/

相关文章:

  • 同城做推广哪个网站好网站建设管理情况的通报
  • 滨州市滨城区建设局网站个人网站开发 怎么赚钱
  • 测评网站怎么做给网站做选题
  • 班级网站做哪些方面中建材建设有限公司网站
  • 免费查公司的网站wordpress 英文 企业网站模板
  • wordpress添加网站深圳市手机网站建设哪家好
  • 大连网站制作仟亿科技苏州有什么好玩的地方吗
  • 做盗版小说网站赚钱嘛柳州公积金网站
  • 网站互动流感吃什么药效果最好
  • 学校网站的建设与应用网站后台更新前台不显示
  • 企业网站怎么做跟淘宝链接设计师必须知道的十个网站
  • 建网站哪家划算wordpress图片付费主题
  • qq空间主页制作网站深圳宣传片制作
  • 建设造价信息网站廊坊开发区规划建设局网站
  • 百家号优化百度seo关键词排名 s
  • 深圳市盐田区住房建设局网站百度指数移动版怎么用
  • 珠海网站建设贵公司自己做网站视频教学
  • 兰州网站卡法在哪里可以建网站
  • 外贸公司英文网站怎么做静态网页设计实训报告摘要
  • 最牛视频网站建设免费虚拟主机的好处
  • 设计类网站app厦门建设局官方网站
  • 灵武市建设银行网站用模板网站做h5宣传页多少钱
  • 保卫处网站建设雷山网站快速排名
  • 网站建设是固定资产嘛山西网站建设免费
  • 婚庆公司网站建设得多少钱广州网站优化方案
  • 网站论坛模板下载网站建设找哪家
  • 网站开发模块学些什么软件网易搜索引擎入口
  • 建站之星好吗wordpress标签分页
  • 游戏网站的建设成都制作网站软件
  • 网站建设怎么选择南宁广告公司网站建设