比如说对数组快排的思路就是:

  1. 选取一个基准(可以选数组的开头最为基准,令 i = 0 ;j = array.length -1)
  2. 从arr[j]向前遍历(j--),当该值大于基准,则交换,退出循环(break)。
  3. 从arr[i]向后遍历(i++),当该值大于基准,则交换,退出循环(break)。
  4. 重复步骤2和步骤3,直到 i == j。此时a[i] 左边都小于a[i],右边都大于a[i]。
  5. 根据下标分别递归左右两边的部分,注意一下递归出口就ok了。
/*** @author vigdxx@gmail.com* @param {Array} arr 待排序数组*/
function quickSort(arr) {/*** @description 对数组的一部分进行排序,快排的基准为取待排序部分首项* @param {Number} i  待排序部分开始位置* @param {Number} j 待排序部分结束位置*/function sort(i,j) {if(i >= j) {return} // 递归出口 let start = i;let end = j;while(i < j) {for(;j>i;j--) {if(arr[i] > arr[j]) {[arr[j],arr[i]] = [arr[i],arr[j]];break;} }// 这个地方用 ++i,可以少一次比较for(;i<j;++i) {if(arr[i] > arr[j]) {[arr[j],arr[i]] = [arr[i],arr[j]];break;} }}// 此时 i == j , arr[i] 左边的小于等于 arr[i],右边的大于arr[i]sort(start,i-1);sort(i+1,end)}sort(0,arr.length - 1);return arr;
}
复制代码

快排的时间复杂度是 O(nlogn),是一种不稳定的排序算法。当出现 大量重复数据时 ,上述快排算法并不是一种最有解,他的改进型:三向切分快速排序是一种更高效的算法。其思想就是把一个数组分为三部分,一部分小于pivot,一部分等于pivot,还有一部分大于pivot。代码如下

function quickSort3way(arr) {function sort3way(low, high) {if(low >= high) {return}let lt = low;//小于pivot的元素交换点let gt = high;//大于pivot的元素交换点let i = low +1;let pivot = arr[low];while(i <= gt) {if (arr[i] < pivot) {[arr[i], arr[lt]] = [arr[lt], arr[i]];i++;lt++;} else if (arr[i] === pivot) {i++;} else if (arr[i] > pivot) {[arr[i], arr[gt]] = [arr[gt], arr[i]];gt--;//此时 不能i++,因为交换后不能保证 arr[i] 等于还是小于 pivot}}sort3way(low,lt-1);sort3way(gt+1,high);}sort3way(0,arr.length-1);return arr;
}
复制代码

转载于:https://juejin.im/post/5af69223f265da0b7b35fb7b

javascript 实现快排 ,三向切分快排相关推荐

  1. 快排堆排归排三种排序的比较

    目录 快排 堆排序 归并排序 三种排序的比较 快排 快速排序中最简单的(递归调用) 注:倒序,和 列表中有大量重复元素时,时间复杂度很大 快排例子 注:快排代码实现(类似于二叉树 递归调用) 时间复杂 ...

  2. 快排三种基本解法以及两种快排优化

    /*  快速排序  基本思想    选定每次排序的基准数据 在剩下的位置将小于基准值的数据放在基准值得左边,大于基准值的数据放到基准值的右边    一次划分之后 如果此基准值的左右两边仍存在大于两个数 ...

  3. 【转】UGUI研究院之缓存策略让UI打开更快(三十)

    [转]UGUI研究院之缓存策略让UI打开更快(三十) UGUI研究院之缓存策略让UI打开更快(三十) [投稿]Unity3D游戏优化之头顶UI 注意里面提到了:SuperTextMesh:能渲染动态文 ...

  4. 【软件】[Qt\C++] 冒泡、希尔、堆排、基数、快排 5种排序Gui界面带对比——使用Qt实现

    完整代码 https://github.com/gongfpp/sortsWithQt 成品(随机生成数字后全过了一遍) 一. 实验任务(实验题目.目的) 实现5种排序(冒泡.希尔.堆排.基数.快排) ...

  5. 排序算法 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数

    文章目录 写在前面 排序 1. 基数排序`稳定` 2. 归并排序`稳定`merge sort 3. 快速排序`不稳定`quick sort 4. 堆排序`不稳定`heap sort 大根堆 小根堆 5 ...

  6. 豪言开设10万+门店,正新鸡排如何跑这么快?

    一块小小的鸡排,代表着创始人陈传武大大的财富秘诀. 通过探秘"小吃下沉王者"的发家致富路线,带你发现不一样的正新鸡排. 一路辉煌过后,如今它也会有过不去的难关?快餐小吃行业趋势或将 ...

  7. php快排,网址快排 快速排名软件 thinkphp快排源码 网站快排程序 百度排名

    网址快排快速排名软件thinkphp快排源码网站快排程序百度排名 thinkphp快排源码 会员自助可以注册添加网站进行操作 根据快排系统平台的基本原理看,要做到被逐渐访问必须是该关键词已经有排名在百 ...

  8. 玛氏携手阿里 天猫网罗全球快消三巨头

    本文讲的是玛氏携手阿里 天猫网罗全球快消三巨头[IT168 云计算]6月29日,玛氏公司与阿里巴巴集团签订战略合作协议,这是近3个月来,与阿里达成战略合作的第三个全球食品快消巨头. --4月,玛氏旗下 ...

  9. 前端快闪三:多环境灵活配置react

    大前端快闪:package.json文件知多少? 大前端快闪二:react开发模式 一键启动多个服务 你已经使用Create React App[1] 脚手架搭建了React应用,现在该部署了. 一般 ...

最新文章

  1. 损坏防浪涌电插排内部电路
  2. c++函数内部可以返回函数内部定义的指针 但是不能返回函数内部定义的数组...
  3. 一b变频器说明书参数一览表_电工常见的23个变频器问题整理,附专业解答
  4. Windows x64内核学习笔记(三)—— SMEP SMAP
  5. 动态规划——编辑距离
  6. numpy二维数组改变某些数_机器学习:Python常用库——Numpy库
  7. oracle 本地数据库卸载,完美卸载Oracle数据库
  8. 秒开路由sam1_野狼SAM机架精编版V1.0官方版-独木成林
  9. 维修管理系统微信小程序部署流程
  10. cdr2022辅助注册机序列号
  11. 东野圭吾《沉默的巡游》简单书评(含剧透)
  12. Java实现文件搜索
  13. java upperbound_scala类型系统:11) upper bounds lower bounds
  14. mysql安装教程 mac_Mac下MySQL安装配置教程
  15. web performance tu ning
  16. 漫谈深度学习时代点击率预估技术进展
  17. java olap oracle_【案例】Oracle数据库升级OLAP组件异常 删除OLAP组件
  18. 计算机兴趣班学什么好处,电脑兴趣班教学工作计划
  19. 即将取代Maven和Gradle的新一代更强更快的构建工具(至尊典藏版)
  20. SpringBoot学生信息管理系统_毕业设计(附源码)

热门文章

  1. Windows服务器上Mysql为设置允许远程连接提示:not allowed to connect to this MySQL server
  2. Node中自启动工具supervisor的使用
  3. 2019云栖大会精品资料免费下载
  4. 快速上手用Python搭建自己的第一个pyecharts图表
  5. Maven配置阿里镜像仓库
  6. v-modedl的修饰符
  7. java 素数 五行_【数论】素数的判定与筛法
  8. android 触摸屏 旋转,android-使用OpenGl和触摸屏功能在视觉上纠正旋转
  9. matlab作业参考4,matlab第四章作业
  10. 桑文锋:创业是场持久战,我希望能重构中国互联网的数据根基