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 相关文章推荐
(function($){...})(jQuery)的意思
Jul 22 Javascript
jquery图片切换插件
Mar 16 Javascript
超赞的动手创建JavaScript框架的详细教程
Jun 30 Javascript
Jquery实现顶部弹出框特效
Aug 08 Javascript
Javascript获取background属性中url的值
Oct 17 Javascript
基于ajax与msmq技术的消息推送功能实现代码
Dec 26 Javascript
js基于myFocus实现轮播图效果
Feb 14 Javascript
JS滚动到指定位置导航栏固定顶部
Jul 03 Javascript
jQuery实现的简单获取索引功能示例
Jun 04 jQuery
浅析Vue 防抖与节流的使用
Nov 14 Javascript
js实现电灯开关效果
Jan 19 Javascript
前端实现滑动按钮AJAX与后端交互的示例代码
Feb 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
图书管理程序(三)
2006/10/09 PHP
php实现简单文件下载的方法
2015/01/30 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
JavaScript移除数组元素减少长度的方法
2013/09/05 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Python下载网络小说实例代码
2018/02/03 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
详解python3中的真值测试
2018/08/13 Python
Python3爬虫全国地址信息
2019/01/05 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
python3安装crypto出错及解决方法
2019/07/30 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
终端业务员岗位职责
2013/11/27 职场文书
小学英语教学反思案例
2014/02/04 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
思想政治表现评语
2015/01/04 职场文书
小学生运动会广播
2015/08/19 职场文书
2016年记者节感言
2015/12/08 职场文书
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android