http://www.nowamagic.net/javascript/js_SortEffectiveInJavascript.php
JavaScript排序性能比较
2011-02-15
排序是经常使用的编程例子,在JavaScript里各种排序的性能又如何呢?每个浏览器测试得出的数据会不一样。比如我用chrome 测试 一般快速排序都会最快,IE 则根据数组长度有可能希尔最快。
不要用太大数据去测试冒泡排序(浏览器崩溃了我不管)。
[quickSort]: 0,1,2,3,4,5,6,7,8,9
[insertSort]: 0,1,2,3,4,5,6,7,8,9
[shellSort]: 0,1,2,3,4,5,6,7,8,9
[systemSort]: 0,1,2,3,4,5,6,7,8,9
[bubbleSort]: 0,1,2,3,4,5,6,7,8,9
快速排序 插入排序 希尔排序 系统方法 冒泡排序 清空
测试数组长度:
测试次数:10次
数组太长请慎用 冒泡排序
测试次数:10次
数组太长请慎用 冒泡排序
快速排序 | 1000 | 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, | 0.3 | 测试 |
插入排序 | 1000 | 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, | 1.3 | 测试 |
希尔排序 | 1000 | 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, | 0.4 | 测试 |
系统方法 | 1000 | 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, | 0.2 | 测试 |
冒泡排序 | 1000 | 6, 5, 5, 5, 3, 4, 5, 5, 5, 5, | 4.8 | 小心测试 |
个人理解:
- 冒泡排序:最简单,也最慢,貌似长度小于7最优
- 插入排序: 比冒泡快,比快速排序和希尔排序慢,较小数据有优势
- 快速排序:这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合
- 希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快
- 系统方法:在forfox下系统的这个方法非常快
JavaScript Code
001 |
<script type= "text/javascript" >
|
002 |
Jun = {}; |
003 |
Jun.array = { |
004 |
|
005 |
|
006 |
df: function (len){
|
007 |
var array = [], i;
|
008 |
len = len || 1000;
|
009 |
for (i = 0; i< len; i++){
|
010 |
array.push(i);
|
011 |
}
|
012 |
return array.sort( function (){ return Math.random() > 0.5});
|
013 |
},
|
014 |
// Jun.array.test();
|
015 |
test: function (method, arrayLength, callBack){
|
016 |
|
017 |
var times = [];
|
018 |
var i = 0;
|
019 |
var sum = 0;
|
020 |
var len = 10;
|
021 |
|
022 |
for (;i<len;i++){
|
023 |
test();
|
024 |
}
|
025 |
|
026 |
for (i=0;i<times.length;i++){
|
027 |
sum+=times[i];
|
028 |
}
|
029 |
|
030 |
|
031 |
032 |
function test(){
|
033 |
var array = Jun.array.df(arrayLength);
|
034 |
var st = new Date().getTime();
|
035 |
Jun.array[method](array); //shellSort quickSort systemSort
|
036 |
var d = new Date().getTime() - st;
|
037 |
callBack && callBack( new Date().getTime() - st);
|
038 |
times.push(d);
|
039 |
}
|
040 |
|
041 |
return sum / len;
|
042 |
},
|
043 |
|
044 |
// ---------- 一些排序算法
|
045 |
// js 利用sort进行排序
|
046 |
systemSort: function (array){
|
047 |
return array.sort( function (a, b){
|
048 |
return a - b;
|
049 |
});
|
050 |
},
|
051 |
// 冒泡排序
|
052 |
bubbleSort: function (array){
|
053 |
var i = 0, len = array.length,
|
054 |
j, d;
|
055 |
for (; i<len; i++){
|
056 |
for (j=0; j<len; j++){
|
057 |
if (array[i] < array[j]){
|
058 |
d = array[j];
|
059 |
array[j] = array[i];
|
060 |
array[i] = d;
|
061 |
}
|
062 |
}
|
063 |
}
|
064 |
return array;
|
065 |
},
|
066 |
// 快速排序
|
067 |
quickSort: function (array){
|
068 |
//var array = [8,4,6,2,7,9,3,5,74,5];
|
069 |
//var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
|
070 |
var i = 0;
|
071 |
var j = array.length - 1;
|
072 |
var Sort = function (i, j){
|
073 |
|
074 |
// 结束条件
|
075 |
if (i == j ){ return };
|
076 |
|
077 |
var key = array[i];
|
078 |
var stepi = i; // 记录开始位置
|
079 |
var stepj = j; // 记录结束位置
|
080 |
|
081 |
while (j > i){
|
082 |
// j <<-------------- 向前查找
|
083 |
if (array[j] >= key){
|
084 |
j--;
|
085 |
} else {
|
086 |
array[i] = array[j]
|
087 |
//i++ ------------>>向后查找
|
088 |
while (j > ++i){
|
089 |
if (array[i] > key){
|
090 |
array[j] = array[i];
|
091 |
break ;
|
092 |
}
|
093 |
}
|
094 |
}
|
095 |
}
|
096 |
|
097 |
// 如果第一个取出的 key 是最小的数
|
098 |
if (stepi == i){
|
099 |
Sort(++i, stepj);
|
100 |
return ;
|
101 |
}
|
102 |
|
103 |
// 最后一个空位留给 key
|
104 |
array[i] = key;
|
105 |
|
106 |
// 递归
|
107 |
Sort(stepi, i);
|
108 |
Sort(j, stepj);
|
109 |
}
|
110 |
|
111 |
Sort(i, j);
|
112 |
|
113 |
return array;
|
114 |
},
|
115 |
|
116 |
// 插入排序
|
117 |
insertSort: function (array){
|
118 |
|
121 |
//var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
|
122 |
|
123 |
var i = 1, j, step, key,
|
124 |
len = array.length;
|
125 |
|
126 |
for (; i < len; i++){
|
127 |
|
128 |
step = j = i;
|
129 |
key = array[j];
|
130 |
|
131 |
while (--j > -1){
|
132 |
if (array[j] > key){
|
133 |
array[j+1] = array[j];
|
134 |
} else {
|
135 |
break ;
|
136 |
}
|
137 |
}
|
138 |
|
139 |
array[j+1] = key;
|
140 |
}
|
141 |
|
142 |
return array;
|
143 |
},
|
144 |
|
145 |
// 希尔排序
|
146 |
//Jun.array.shellSort(Jun.array.df(10000));
|
147 |
shellSort: function (array){
|
148 |
150 |
// var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
|
151 |
|
152 |
var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse() 在维基上看到这个最优的步长 较小数组
|
153 |
//var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//针对大数组的步长选择
|
154 |
var i = 0;
|
155 |
var stepArrLength = stepArr.length;
|
156 |
var len = array.length;
|
157 |
var len2 = parseInt(len/2);
|
158 |
|
159 |
for (;i < stepArrLength; i++){
|
160 |
if (stepArr[i] > len2){
|
161 |
continue ;
|
162 |
}
|
163 |
|
164 |
stepSort(stepArr[i]);
|
165 |
}
|
166 |
167 |
// 排序一个步长
|
168 |
function stepSort(step){
|
169 |
|
170 |
//console.log(step) 使用的步长统计
|
171 |
|
172 |
var i = 0, j = 0, f, tem, key;
|
173 |
var stepLen = len%step > 0 ? parseInt(len/step) + 1 : len/step;
|
174 |
|
175 |
|
176 |
for (;i < step; i++){ // 依次循环列
|
177 |
178 |
for (j=1; /*j < stepLen && */ step * j + i < len; j++){ //依次循环每列的每行
|
179 |
tem = f = step * j + i;
|
180 |
key = array[f];
|
181 |
182 |
while ((tem-=step) >= 0){ // 依次向上查找
|
183 |
if (array[tem] > key){
|
184 |
array[tem+step] = array[tem];
|
185 |
} else {
|
186 |
break ;
|
187 |
}
|
188 |
}
|
189 |
|
190 |
array[tem + step ] = key;
|
191 |
|
192 |
}
|
193 |
}
|
194 |
|
195 |
}
|
196 |
|
197 |
return array;
|
198 |
|
199 |
}
|
200 |
};
|
201 |
</script> |
202 |
203 |
<script type= "text/javascript" >
|
204 |
var jelle = {
|
205 |
index:1,
|
206 |
$: function (id){
|
207 |
return document.getElementById(id);
|
208 |
},
|
209 |
test: function (method, num){
|
210 |
var arrayLength = parseInt(jelle.$( 'arrayLength' ).value);
|
211 |
jelle.index = num;
|
212 |
jelle.$( 'length_' +num).innerHTML = arrayLength;
|
213 |
jelle.$( 'times_' +num).innerHTML = '' ;
|
214 |
jelle.$( 'time_' +num).innerHTML = Jun.array.test(method, arrayLength, jelle.insert);;
|
215 |
},
|
216 |
insert: function (num){
|
217 |
jelle.$( 'times_' +jelle.index).innerHTML += num+ ', ' ;
|
218 |
},
|
219 |
correctness: function (method){
|
220 |
var array = new Function( 'return ' + jelle.$( 'testArray' ).value)();
|
221 |
jelle.$( 'testResults' ).innerHTML += '<div>[' +method+ ']: ' +Jun.array[method](array)+ '</div>' ;
|
222 |
}
|
223 |
}
|
224 |
</script> |
随机文章推荐 |
- JavaScript实现的颜色选择器
- JavaScript团队编程规范与建议
- PNG 透明兼容 IE6 的几种方法
- DOM 编程艺术:getElementsByTagName() 方法
- 动态增加元素的DOM操作
- JavaScript计算两个日期的时间差
- JavaScript 滚动文字
- 金额数字格式化与四舍五入
- Google 首页纪念牛顿特效
- 判断单选按钮与上传文件不能为空
- 你需要知道的JavaScript的背景知识
- JavaScript的事件冒泡是什么
<iframe id="aswift_1" style="left: 0px; position: absolute; top: 0px;" name="aswift_1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="200" height="200"></iframe> |
网站分类 |
相关推荐
1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
在Java中,实现二叉树的中序遍历同样可以通过递归来完成。中序遍历的顺序是:首先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。 在这段代码中,Node类定义了二叉树的节点,BinaryTree类包含一个指向根节点的指针和inOrder方法,用于递归地进行中序遍历。printInOrder方法调用inOrder方法并打印出遍历的结果。 在Main类中,我们创建了一个示例二叉树,并调用printInOrder方法来输出中序遍历的结果。输出应该是:4 2 5 1 3,这表示中序遍历的顺序是左子树(4),然后是根节点(2),接着是右子树的左子树(5),然后是右子树的根节点(1),最后是右子树的右子树(3)。
无头单向非循环链表的实现(函数定义文件)
"PTA" 通常指的是一种在线编程平台,例如“Pata”或者某些特定学校或组织的编程练习与自动评测系统。在这种平台或系统中,学生或程序员会提交代码来解决各种问题,然后系统会自动运行并评测这些代码的正确性。 当提到“两个有序链表的合并PTA”时,这通常意味着在PTA平台上解决一个特定的问题,即合并两个有序链表。具体任务可能是给定两个已按升序排序的链表,要求编写代码来合并这两个链表,形成一个新的有序链表。
1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
搜索引擎的设计与实现
工作总结,新年计划,岗位总结,工作汇报,个人总结,述职报告,范文下载,新年总结,新建计划。
【基于Springboot+Vue的Java毕业设计】无人超市管理系统项目实战(源码+录像演示+说明).rar 【项目技术】 开发语言:Java 框架:Spingboot+vue 架构:B/S 数据库:mysql 【演示视频-编号:314】 https://pan.quark.cn/s/8dea014f4d36 【实现功能】 无人超市管理系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,商品类型管理,支付类型管理,公告类型管理,商品信息管理,出入库管理,出入库详情管理,购买管理,购买详情管理,公告信息管理。用户可以注册登录,自助购买,点击购买管理里面收银就可以选择支付类型和商品然后提交,还可以查看购买详情和公告信息。
1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
年会班会资料,节目策划,游戏策划,策划案,策划方案,活动方案,筹办,公司年会,开场白,主持人,策划主题,主持词,小游戏。
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台中,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥中心为枢纽,以各级管理部门和经营港 口企业为节点,快速调度、信息共享的通信网络,满足应急处置中所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。
【基于Java+Springboot的毕业设计】线上医院挂号系统(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:Spingboot+vue 架构:B/S 数据库:mysql 【演示视频-编号:300】 https://pan.quark.cn/s/8dea014f4d36 【实现功能】 本次开发的线上医院挂号系统实现了字典管理、论坛管理、会员管理、单页数据管理、医生管理、医生留言管理、医生挂号订单管理、管理员管理等功能。
工作总结,新年计划,岗位总结,工作汇报,个人总结,述职报告,范文下载,新年总结,新建计划。
Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示
最全英语六级真题,从12年到23年总共66个真题。全网最全。
工作总结,新年计划,岗位总结,工作汇报,个人总结,述职报告,范文下载,新年总结,新建计划。
基于深度学习的人体姿态识别.zip
01. XX塑业有限公司ERP物料编码规则(DOC 6页).doc