JS实现随机化快速排序的实例代码


Posted in Javascript onAugust 01, 2013

算法的平均时间复杂度为O(nlogn)。但是当输入是已经排序的数组或几乎排好序的输入,时间复杂度却为O(n^2)。为解决这一问题并保证平均时间复杂度为O(nlogn)的方法是引入预处理步骤,它惟一的目的是改变元素的顺序使之随机排序。这种预处理步骤可在O(n)时间内运行。能够起到同样作用的另一种简单方法是在算法中引入一个随机元素,这可以通过随机地选择拆分元素的主元来实现。随机选择主元的结果放宽了关于输入元素的所有排列的可能性相同的步骤。引入这一步来修正原先的快速排序,可得到下面所示的随机化快速排序。新算法只是在区间[low…high]中一致随机地选择一个索引v,并将A[v]和A[low]交换,然后按照原来的快速排序算法继续。这里,parseInt(Math.random()*(high-low+1) + low)返回一个在low和high之间的数。

/****************************************

算法:split

输入:数组A[low...high]

输出:

1.若有必要,输出按上述描述的重新排列的数组A;

2.划分元素A[low]的新位置w;

****************************************/

function split(array, low, high) {

var i = low;

var x = array[low];

for(var j = low + 1; j <= high; j++) {

if(array[j] <= x) {

i ++;

if(i != j) {

var temp = array[i];

array[i] = array[j];

array[j] = temp;

}

}

}

temp = array[low];

array[low] = array[i];

array[i] = temp;

return i;

}

/****************************************

算法:rquicksort

输入:A[0...n-1]

输出:按非降序排列数组A[0...n-1]

rquicksort(A, 0, n-1);

****************************************/

function rquicksort(array, low, high) {

if(low < high) {

/******随机化拆分元素的主元*******/

var v = parseInt(Math.random()*(high-low+1) + low);

var tmp = array[low];

array[low] = array[v];

array[v] = tmp;

/******随机化拆分元素的主元*******/

var w = split(array, low, high);

rquicksort(array, low, w -1);

rquicksort(array, w +1, high);

return array;

}

}

var array = [33, 22, 11, 88, 23, 32];

array = rquicksort(array, 0, array.length-1);

console.log(array);
Javascript 相关文章推荐
Javascript var变量隐式声明方法
Oct 19 Javascript
js报错 Object doesn't support this property or method的原因分析
Mar 31 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
Oct 27 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
May 17 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
Nov 28 Javascript
Javascript中Array.prototype.map()详解
Oct 22 Javascript
js获取指定时间的前几秒
Apr 05 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
详解Vue组件之间通信的七种方式
Apr 14 Javascript
element-ui组件中input等的change事件中传递自定义参数
May 22 Javascript
微信小程序实现收货地址左滑删除
Nov 18 Javascript
Antd下拉选择,自动匹配功能的实现
Oct 24 Javascript
js中的前绑定和后绑定详解
Aug 01 #Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
Aug 01 #Javascript
jquery实现带复选框的表格行选中删除时高亮显示
Aug 01 #Javascript
JQuery的自定义事件代码,触发,绑定简单实例
Aug 01 #Javascript
jquery实现带单选按钮的表格行选中时高亮显示
Aug 01 #Javascript
JavaScript定时器详解及实例
Aug 01 #Javascript
js渐变显示渐变消失示例代码
Aug 01 #Javascript
You might like
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
Vue自定义事件(详解)
2017/08/19 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
python中input()与raw_input()的区别分析
2016/02/27 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
详解tensorflow实现迁移学习实例
2018/02/10 Python
python之生产者消费者模型实现详解
2019/07/27 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
Python安装Bs4的多种方法
2020/11/28 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
c语言常见笔试题总结
2016/09/05 面试题
大二自我鉴定范文
2013/10/05 职场文书
计算机学生求职信范文
2014/01/30 职场文书
保证书格式范文
2014/04/28 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
前台接待岗位职责
2015/02/03 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python