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 HTML中的table
Apr 15 Javascript
DOM节点删除函数removeChild()用法实例
Jan 12 Javascript
实现无刷新联动例子汇总
May 20 Javascript
jquery easyUI中ajax异步校验用户名
Aug 19 Javascript
jQuery实现简单的tab标签页效果
Sep 12 Javascript
Node.js中用D3.js的方法示例
Jan 16 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
Apr 07 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
Jul 18 Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 Javascript
vue Tab切换以及缓存页面处理的几种方式
Nov 05 Javascript
js实现弹幕墙效果
Dec 10 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 身份证号验证函数
2009/05/07 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
$()JS小技巧
2007/07/21 Javascript
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
vue实现微信分享功能
2018/11/28 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
Python with用法实例
2015/04/14 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
教师岗位职责范本
2013/12/29 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
第二课堂活动总结
2014/05/07 职场文书
团代会宣传工作方案
2014/05/08 职场文书
篮球赛口号
2014/06/18 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python