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 定义初始化数组函数
Sep 07 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
May 17 Javascript
日常收藏的jquery技巧
Dec 02 Javascript
用js动态添加html元素,以及属性的简单实例
Jul 19 Javascript
JS中对数组元素进行增删改移的方法总结
Dec 15 Javascript
vue侧边栏动态生成下级菜单的方法
Sep 07 Javascript
Vue slot用法(小结)
Oct 22 Javascript
Mint UI组件库CheckList使用及踩坑总结
Dec 20 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
May 05 Javascript
p5.js绘制创意自画像
Nov 04 Javascript
js DOM的事件常见操作实例详解
Dec 16 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
PHP下对数组进行排序的函数
2010/08/08 PHP
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
js闭包实例汇总
2014/11/09 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
Python基本数据类型详细介绍
2014/03/11 Python
Python中生成Epoch的方法
2017/04/26 Python
Python通过future处理并发问题
2017/10/17 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
英语道歉信范文
2014/01/09 职场文书
三万活动总结
2014/04/28 职场文书
服务行业口号
2014/06/11 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
2014年加油站工作总结
2014/12/04 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
关于教师节的广播稿
2015/08/19 职场文书
如何用python清洗文件中的数据
2021/06/18 Python
python识别围棋定位棋盘位置
2021/07/26 Python
Spring 使用注解开发
2022/05/20 Java/Android