`

转:JavaScript排序性能比较

 
阅读更多

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次
数组太长请慎用 冒泡排序
算法 数组长度 分别用时(毫秒) 平均(毫秒) 点击测试
快速排序 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          
120         // http://baike.baidu.com/view/396887.htm
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排序算法实现

    通过对不同排序算法的比较,我们可以根据实际需求选择效率更高、更适合场景的排序方式。例如,对于小规模数据,插入排序可能就足够了;而对于大规模数据,快速排序或归并排序通常会是更好的选择。 在`jsSortCode....

    JS:表格排序

    标题“JS:表格排序”指的是使用JavaScript实现对HTML表格数据的动态排序功能。在网页开发中,表格是一种常见的数据展示方式,而用户有时需要按照不同的列进行升序或降序排序,以方便查看和分析数据。JavaScript作为...

    图书:JavaScript模式

    同时,会讲解常见的排序、搜索等算法,提升代码的性能。 5. **事件驱动编程**:JavaScript在浏览器环境中的核心特性就是事件驱动,书中会介绍事件循环、事件委托等机制,以及如何有效地处理异步操作。 6. **错误...

    通过实例解析JavaScript常用排序算法

    JavaScript中的排序算法是编程基础知识的重要组成部分,特别是在处理数据和优化性能时显得尤为关键。本文将深入探讨四种常见的排序算法:冒泡排序、快速排序、选择排序以及插入排序,并通过实例代码进行详细解析。 ...

    JavaScript-使用javascript开发的排序算法-sorting.zip

    在JavaScript中,这些排序算法可以通过Array.prototype.sort()方法来实现,但原生的sort()函数默认使用的是快速排序的变种,对于复杂的数据类型或自定义排序规则,我们需要提供一个比较函数来确保正确排序。...

    Javascript表格排序大全

    3. **原生JavaScript排序**:你可以通过获取表格数据,对其进行排序,然后重新渲染表格。例如,使用`Array.prototype.sort()`函数对表格数据进行排序,再利用DOM操作更新表格内容。 4. **事件监听**:为了实现点击...

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录

    排序算法是计算机科学中至关重要的一部分,它涉及到如何有效地组织和排列数据。无论是处理数据库记录、优化数据结构...记住,选择哪种排序算法取决于数据的特性和性能需求,比如数据量大小、是否稳定、空间复杂度等。

    JQ JS javascript 拖拽 排序功能 列表排序 菜单排序 表格排序

    在本主题中,我们将深入探讨如何利用jQuery和JavaScript实现拖拽排序功能,适用于列表、菜单和表格等元素。 一、拖拽排序基础概念 拖拽排序是一种用户交互设计,允许用户通过鼠标拖动来改变元素的顺序。这种功能在...

    用javascript实现的十大排序算法详解

    JavaScript实现冒泡排序的关键在于两层循环结构,外层控制遍历次数,内层用于比较和交换。 2. 插入排序(Insertion Sort) 插入排序是将未排序的元素逐个插入到已排序部分的方法。在JavaScript中,可以使用一个辅助...

    JavaScript计数排序算法1

    JavaScript中的计数排序算法是一种非比较型排序算法,它的核心思想是通过统计待排序数组中每个元素出现的次数,然后根据这些计数直接确定每个元素在输出数组中的位置。由于这种算法是基于数字的出现频率来进行排序,...

    javascript table排序 2.0 (更新)

    - **性能优化**:对于大数据量的表格,可能会采用更高效的排序算法,如快速排序或归并排序,以减少排序时间。 - **多级排序**:允许用户根据多个列进行排序,例如,先按年龄排序,再按名字排序。 - **自定义排序逻辑...

    javaScript对表格排序

    在JavaScript中,对表格进行排序是一项常见的需求,特别是在构建交互式网页时。...在实际项目中,可以进一步优化这个算法,比如引入快速排序或归并排序,以提高大规模数据的排序性能,或者处理复杂的数据类型。

    javascript字符串排序

    通过学习这份文档,我们可以深入理解自定义排序函数的工作原理,以及如何根据具体需求调整和优化排序逻辑,从而在实际项目中提高性能。 总结来说,JavaScript字符串排序涉及的关键知识点包括: 1. `Array.prototype...

    JavaScript快速排序1

    JavaScript快速排序是一种高效的排序算法,基于分治策略。在快速排序中,我们首先选择一个基准值(pivot),然后重新组织数组,使得基准值左边的所有元素都比它小,右边的所有元素都比它大。这个过程叫做分区操作。...

    JavaScript Sort 表格排序

    总的来说,JavaScript中的`sort()`方法和`localeCompare()`函数是实现表格排序的关键工具,但需要配合自定义的比较函数和数据转换策略,以适应不同类型的表格数据。理解这些概念并正确应用它们,可以帮助我们构建出...

    Algoritmos:JavaScript的排序和搜索算法

    本资源聚焦于JavaScript中的排序和搜索算法,这两种算法是计算机科学中最基础且实用的部分。 首先,让我们探讨排序算法。在JavaScript中,有多种方法对数组进行排序,例如: 1. **冒泡排序**:这是一种简单的排序...

    youtube-duration-sort:按时长排序YouTube订阅视频-源码

    可能需要自定义比较函数来确保正确排序。 5. **事件监听**:为了响应用户的交互,例如点击排序按钮,需要使用`addEventListener()`来监听和处理事件。 6. **UI更新**:排序后,可能使用`innerHTML`或`textContent`等...

    javascript Table排序

    JavaScript表格排序是网页开发中常见的需求,特别是在处理动态数据或者用户交互时。本文将深入探讨如何使用JavaScript实现表格数据的排序功能。 首先,我们需要理解HTML `&lt;table&gt;`元素的基本结构。一个表格由`...

Global site tag (gtag.js) - Google Analytics