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 相关文章推荐
jquery 子窗口操作父窗口的代码
Sep 21 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 Javascript
js的Boolean对象初始值示例
Mar 04 Javascript
Window.Open打开窗体和if嵌套代码
Apr 15 Javascript
angular2倒计时组件使用详解
Jan 12 Javascript
JavaScrpt的面向对象全面解析
May 09 Javascript
vue打包后显示空白正确处理方法
Nov 01 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 Javascript
JavaScript引用类型Array实例分析
Jul 24 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
Mar 15 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 Javascript
js通过循环多张图片实现动画效果
Dec 19 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
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
Python中pillow知识点学习
2018/04/30 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
Django 限制访问频率的思路详解
2019/12/24 Python
Python数据存储之 h5py详解
2019/12/26 Python
在python中使用nohup命令说明
2020/04/16 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
电子商务专业学生的学习自我评价
2013/10/27 职场文书
小学生获奖感言范文
2014/02/02 职场文书
淘宝活动策划方案
2014/02/06 职场文书
大学自主招生推荐信
2014/05/10 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
办公室岗位职责范本
2015/04/11 职场文书
大学生党课感想
2015/08/11 职场文书
关于教师节的广播稿
2015/08/19 职场文书
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript