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 相关文章推荐
url地址自动加#号问题说明
Aug 21 Javascript
JQuery 返回布尔值Is()条件判断方法代码
May 14 Javascript
深入理解Javascript动态方法调用与参数修改的问题
Dec 10 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
May 08 Javascript
JavaScript模版引擎的基本实现方法浅析
Feb 15 Javascript
jquery PrintArea 实现票据的套打功能(代码)
Mar 17 Javascript
js+canvas实现动态吃豆人效果
Mar 22 Javascript
微信小程序 下拉菜单简单实例
Apr 13 Javascript
手机注册发送验证码倒计时的简单实例
Nov 15 Javascript
详解angularjs4部署文件过大解决过程
Dec 05 Javascript
Vue实现日历小插件
Jun 26 Javascript
react native 仿微信聊天室实例代码
Sep 17 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+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
vue二级路由设置方法
2018/02/09 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
Django在win10下的安装并创建工程
2017/11/20 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
利用python计算时间差(返回天数)
2019/09/07 Python
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
小学教师自我鉴定
2013/11/07 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
学习十八大标语
2014/10/09 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
python tqdm用法及实例详解
2021/06/16 Python
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers