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 相关文章推荐
让FireFox支持innerText的实现代码
Dec 01 Javascript
JQuery 1.4 中的Ajax问题
Jan 23 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
Dec 11 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
Apr 16 Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 Javascript
jQuery编写网页版2048小游戏
Jan 06 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
Jun 29 jQuery
import与export在node.js中的使用详解
Sep 28 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
Feb 07 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
May 05 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
Feb 06 Javascript
vue实现信息管理系统
May 30 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 GD绘制24小时柱状图
2008/06/28 PHP
PHP用mysql数据库存储session的代码
2010/03/05 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
项目实践之javascript技巧
2007/12/06 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
详解Python如何生成词云的方法
2018/06/01 Python
python保存网页图片到本地的方法
2018/07/24 Python
css3强大的动画效果animate使用说明及浏览器兼容介绍
2013/01/09 HTML / CSS
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
初中学生期末评语
2014/04/24 职场文书
无房证明范本
2014/09/17 职场文书
会计实训报告范文
2014/11/04 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python