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> |
网站分类 |
相关推荐
通过对不同排序算法的比较,我们可以根据实际需求选择效率更高、更适合场景的排序方式。例如,对于小规模数据,插入排序可能就足够了;而对于大规模数据,快速排序或归并排序通常会是更好的选择。 在`jsSortCode....
标题“JS:表格排序”指的是使用JavaScript实现对HTML表格数据的动态排序功能。在网页开发中,表格是一种常见的数据展示方式,而用户有时需要按照不同的列进行升序或降序排序,以方便查看和分析数据。JavaScript作为...
同时,会讲解常见的排序、搜索等算法,提升代码的性能。 5. **事件驱动编程**:JavaScript在浏览器环境中的核心特性就是事件驱动,书中会介绍事件循环、事件委托等机制,以及如何有效地处理异步操作。 6. **错误...
JavaScript中的排序算法是编程基础知识的重要组成部分,特别是在处理数据和优化性能时显得尤为关键。本文将深入探讨四种常见的排序算法:冒泡排序、快速排序、选择排序以及插入排序,并通过实例代码进行详细解析。 ...
在JavaScript中,这些排序算法可以通过Array.prototype.sort()方法来实现,但原生的sort()函数默认使用的是快速排序的变种,对于复杂的数据类型或自定义排序规则,我们需要提供一个比较函数来确保正确排序。...
3. **原生JavaScript排序**:你可以通过获取表格数据,对其进行排序,然后重新渲染表格。例如,使用`Array.prototype.sort()`函数对表格数据进行排序,再利用DOM操作更新表格内容。 4. **事件监听**:为了实现点击...
排序算法是计算机科学中至关重要的一部分,它涉及到如何有效地组织和排列数据。无论是处理数据库记录、优化数据结构...记住,选择哪种排序算法取决于数据的特性和性能需求,比如数据量大小、是否稳定、空间复杂度等。
在本主题中,我们将深入探讨如何利用jQuery和JavaScript实现拖拽排序功能,适用于列表、菜单和表格等元素。 一、拖拽排序基础概念 拖拽排序是一种用户交互设计,允许用户通过鼠标拖动来改变元素的顺序。这种功能在...
JavaScript实现冒泡排序的关键在于两层循环结构,外层控制遍历次数,内层用于比较和交换。 2. 插入排序(Insertion Sort) 插入排序是将未排序的元素逐个插入到已排序部分的方法。在JavaScript中,可以使用一个辅助...
JavaScript中的计数排序算法是一种非比较型排序算法,它的核心思想是通过统计待排序数组中每个元素出现的次数,然后根据这些计数直接确定每个元素在输出数组中的位置。由于这种算法是基于数字的出现频率来进行排序,...
- **性能优化**:对于大数据量的表格,可能会采用更高效的排序算法,如快速排序或归并排序,以减少排序时间。 - **多级排序**:允许用户根据多个列进行排序,例如,先按年龄排序,再按名字排序。 - **自定义排序逻辑...
在JavaScript中,对表格进行排序是一项常见的需求,特别是在构建交互式网页时。...在实际项目中,可以进一步优化这个算法,比如引入快速排序或归并排序,以提高大规模数据的排序性能,或者处理复杂的数据类型。
通过学习这份文档,我们可以深入理解自定义排序函数的工作原理,以及如何根据具体需求调整和优化排序逻辑,从而在实际项目中提高性能。 总结来说,JavaScript字符串排序涉及的关键知识点包括: 1. `Array.prototype...
JavaScript快速排序是一种高效的排序算法,基于分治策略。在快速排序中,我们首先选择一个基准值(pivot),然后重新组织数组,使得基准值左边的所有元素都比它小,右边的所有元素都比它大。这个过程叫做分区操作。...
总的来说,JavaScript中的`sort()`方法和`localeCompare()`函数是实现表格排序的关键工具,但需要配合自定义的比较函数和数据转换策略,以适应不同类型的表格数据。理解这些概念并正确应用它们,可以帮助我们构建出...
本资源聚焦于JavaScript中的排序和搜索算法,这两种算法是计算机科学中最基础且实用的部分。 首先,让我们探讨排序算法。在JavaScript中,有多种方法对数组进行排序,例如: 1. **冒泡排序**:这是一种简单的排序...
可能需要自定义比较函数来确保正确排序。 5. **事件监听**:为了响应用户的交互,例如点击排序按钮,需要使用`addEventListener()`来监听和处理事件。 6. **UI更新**:排序后,可能使用`innerHTML`或`textContent`等...
JavaScript表格排序是网页开发中常见的需求,特别是在处理动态数据或者用户交互时。本文将深入探讨如何使用JavaScript实现表格数据的排序功能。 首先,我们需要理解HTML `<table>`元素的基本结构。一个表格由`...