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 相关文章推荐
js常见表单应用技巧
Jan 09 Javascript
Jquery 点击按钮显示和隐藏层的代码
Jul 25 Javascript
用JS做的简单的可折叠的两级树形菜单
Sep 21 Javascript
js实现的早期滑动门菜单效果代码
Aug 27 Javascript
jquery采用oop模式class类的使用示例
Jan 22 Javascript
javascript瀑布流式图片懒加载实例
Jun 28 Javascript
javascript实现粘贴qq截图功能(clipboardData)
May 29 Javascript
浅谈Angular中ngModel的$render
Oct 24 Javascript
微信小程序实战之运维小项目
Jan 17 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
Jun 28 Javascript
vue 组件基础知识总结
Jan 26 Vue.js
React服务端渲染原理解析与实践
Mar 04 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
Yii中render和renderPartial的区别
2014/09/03 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
python数据结构树和二叉树简介
2014/04/29 Python
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
获取python文件扩展名和文件名方法
2018/02/02 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
pycharm创建一个python包方法图解
2019/04/10 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
python中实现词云图的示例
2020/12/19 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
创业计划书撰写原则
2014/01/25 职场文书
创先争优承诺书范文
2014/03/31 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python