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模拟的Ping效果代码 (Web Ping)
Mar 13 Javascript
ie8本地图片上传预览示例代码
Jan 12 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
Nov 20 Javascript
Jquery中offset()和position()的区别分析
Feb 05 Javascript
触屏中的JavaScript事件分析
Feb 06 Javascript
使用jQuery获得内容以及内容的属性
Feb 26 Javascript
JavaScript将字符串转换成字符编码列表的方法
Mar 19 Javascript
jquery中表单 多选框的一种巧妙写法
Sep 06 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
Feb 10 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
Apr 19 Javascript
Vue下路由History模式打包后页面空白的解决方法
Jun 29 Javascript
js实现页面导航层级指示效果
Aug 25 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判断远程url是否有效的几种方法小结
2011/10/08 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
Javascript中window.name属性详解
2020/11/19 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
python实现的一个火车票转让信息采集器
2014/07/09 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
深入解析Python中的上下文管理器
2016/06/28 Python
Python部署web开发程序的几种方法
2017/05/05 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
django中的图片验证码功能
2019/09/18 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
用python对oracle进行简单性能测试
2020/12/05 Python
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
台湾生鲜宅配:大口市集
2017/10/14 全球购物
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
学习心得体会
2014/01/01 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
公司业务员管理制度
2015/08/05 职场文书
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技