算法的平均时间复杂度为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);

java 随机化快速排序,JS实现随机化快速排序的实例代码相关推荐

  1. JS实现星星评分功能实例代码(两种方法)

    转载自   JS实现星星评分功能实例代码(两种方法) 一.方法1 1.用到图片 2.结构和样式 <!DOCTYPE html> <html lang="en"&g ...

  2. java 三级菜单栏的添加_[Java教程]jquery实现的三级导航菜单实例代码

    [Java教程]jquery实现的三级导航菜单实例代码 0 2016-01-02 15:00:02 jquery实现的三级导航菜单实例代码: 使用最多的可能是二级导航菜单,所以网上的代码一大堆,三级菜 ...

  3. java 随机手机验证码_基于Java随机生成手机短信验证码的实例代码|chu

    简单版 /** * 产生4位随机数(0000-9999) * * @return 4位随机数 */ public static String getFourRandom() { return Stri ...

  4. html中汉字代码变成数字代码,Angular.js 实现数字转换汉字实例代码

    AngularJS 简介 AngularJS 是一个 JavaScript 框架.它可通过 AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML. 下面通过本文给大家 ...

  5. java+生成手机验证码_基于Java随机生成手机短信验证码的实例代码

    简单版 /** * 产生4位随机数(0000-9999) * * @return 4位随机数 */ public static String getFourRandom() { return Stri ...

  6. java unescape_Java实现JS中的escape和UNescape代码分享

    众所周知,JavaScript中escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串.下面,我们就来看看 Java语言中类似JavaScript中的escape() 和un ...

  7. java一维打地鼠_Java编程实现打地鼠文字游戏实例代码

    控制台输入数字,与随机数匹配,匹配正确则返回"打中了!" 匹配错误则返回"太遗憾!没打中!" package hitmouse; import java.uti ...

  8. java ftp服务器_Java实现FTP服务器功能实例代码

    FTP(File Transfer Protocol 文件传输协议)是Internet 上用来传送文件的协议.在Internet上通过FTP 服务器可以进行文件的上传(Upload)或下载(Downl ...

  9. java视频上传_Java上传视频实例代码

    页面: 上传文件时的关键词:enctype="multipart/form-data" String path = request.getContextPath(); String ...

  10. Java的反射机制,内含超简单实例代码(搞懂反射,这一篇就够了)

    一 首先来说说反射机制的概念: 程序在运行时, 对于类来说,可以知道该类的任意属性和方法: 对于对象来说,可以调用该对象的任意方法和属性: 就以上这种动态获取信息的机制就称为Java的反射机制 彻底了 ...

最新文章

  1. 串口服务器支持多台上位机,RS485多机通信一台上位机两台下位机问题,
  2. java 反正多次重复提交_java web开发时防止刷新后的重复提交
  3. matlab做数据间方差,用matlab做方差比检验的问题
  4. 计算机主板各模块复位,电脑主板复位电路工作原理分析
  5. java aspose 导出word_使用aspose.word 第三方的插件实现导出word
  6. awk命令输出单引号
  7. BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)
  8. 作文未来的计算机医生300字,医生作文300字【3篇】
  9. C#自动切换Windows窗口程序,如何才能调出主窗口?
  10. Json-getJSON
  11. 如何将PDF转换成Word
  12. Windows10如何卸载微软商店
  13. 父亲节php源码,父亲节 | 愿时光再慢一点,祝天下所有的父亲,父亲节快乐
  14. Win10 Synaptics触摸板无法实现双指单击模拟鼠标右键点击的解决办法
  15. HTML超链接怎么设置下拉菜单,html超链接怎么设置
  16. java车机_真·车载版Android来了:车机实现全部功能
  17. TI 生态大宇宙 - 波卡 Polkadot
  18. html表达式 %3c,避开XSS过滤常用方法
  19. 小型计算机电源,身材虽小五脏俱全 精致SFX小电源推荐榜
  20. Android-封装网络请求Retrofit+Rxjava可实现上传下载进度监听

热门文章

  1. ERP流程的一个生动的示例~~
  2. mysql+8.0+新特性_MySQL 8.0备受瞩目的新特性大放送!
  3. maven构建MyBatis项目
  4. react-native 第三方库
  5. c语言超长整数加法计算,两个超长正整数的加法
  6. php选择排序从大到小,PHP选择排序
  7. 基于JAVA+Servlet+JSP+MYSQL的教室资源管理系统
  8. IntelliJ IDEA 2018.2.2远程调试Tomcat的配置方法
  9. Spring Boot 学习系列(05)—自定义视图解析规则
  10. 关于java网络编程的实例代码