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 动态添加事件代码
Nov 30 Javascript
10个新的最有前途的JavaScript框架
Mar 12 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
Sep 16 Javascript
jQuery操作checkbox选择(list/table)
Apr 07 Javascript
JS小功能(列表页面隔行变色)简单实现
Nov 28 Javascript
jquery实现select选中行、列合计示例
Apr 25 Javascript
DOM 事件流详解
Jan 20 Javascript
介绍一个简单的JavaScript类框架
Jun 24 Javascript
重新理解JavaScript的六种继承方式
Mar 24 Javascript
JavaScript递归算法生成树形菜单
Aug 15 Javascript
jquery实现吸顶导航效果
Jan 08 jQuery
javascript canvas封装动态时钟
Sep 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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
原生js实现表格翻页和跳转
2020/09/29 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
python如何生成网页验证码
2018/07/28 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
公务员的自我鉴定
2013/10/26 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
2014婚礼司仪主持词
2014/03/14 职场文书
《海底世界》教学反思
2014/04/16 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
狮子林导游词
2015/02/03 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
sql注入教程之类型以及提交注入
2021/08/02 MySQL