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获取html页面节点方法(递归方式)
Dec 13 Javascript
Javascript保存网页为图片借助于html2canvas库实现
Sep 05 Javascript
浅谈被jQuery抛弃的函数及替代函数
May 03 Javascript
JavaScript:Array类型全面解析
May 19 Javascript
Canvas 制作动态进度加载水球详解及实例代码
Dec 09 Javascript
开发Vue树形组件的示例代码
Dec 21 Javascript
vue使用axios时关于this的指向问题详解
Dec 22 Javascript
js中的this的指向问题详解
Aug 29 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
Sep 03 Javascript
小程序简单两栏瀑布流效果的实现
Dec 18 Javascript
package.json中homepage属性的作用详解
Mar 11 Javascript
jQuery HTML css()方法与css类实例详解
May 20 jQuery
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模拟HTTP认证
2006/10/09 PHP
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
jQuery基础知识小结
2014/12/22 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
Python socket实现简单聊天室
2018/04/01 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
WxPython建立批量录入框窗口
2019/02/27 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
python同时遍历两个list用法说明
2020/05/02 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
大跃进口号
2014/06/16 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS