设为首页收藏本站订阅更新

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

查看: 10029|回复: 34

[原创] 常见排序算法 JS 版 [复制链接]

Rank: 2

升级  42%

注册时间
2006-2-11
威望
75
阅读权限
20
积分
113
帖子
55
精华
1
UID
46889
状态
当前离线
发表于 2006-2-21 20:14:49 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
一键分享 一键分享
JS在这方面的效率比 C++、Java 还是要差很多地……

  1. <script>
  2.     Array.prototype.swap = function(i, j)
  3.     {
  4.         var temp = this[i];
  5.         this[i] = this[j];
  6.         this[j] = temp;
  7.     }

  8.     Array.prototype.bubbleSort = function()
  9.     {
  10.         for (var i = this.length - 1; i > 0; --i)
  11.         {
  12.             for (var j = 0; j < i; ++j)
  13.             {
  14.                 if (this[j] > this[j + 1]) this.swap(j, j + 1);
  15.             }
  16.         }
  17.     }

  18.     Array.prototype.selectionSort = function()
  19.     {
  20.         for (var i = 0; i < this.length; ++i)
  21.         {
  22.             var index = i;
  23.             for (var j = i + 1; j < this.length; ++j)
  24.             {
  25.                 if (this[j] < this[index]) index = j;
  26.             }
  27.             this.swap(i, index);
  28.         }
  29.     }

  30.     Array.prototype.insertionSort = function()
  31.     {
  32.         for (var i = 1; i < this.length; ++i)
  33.         {
  34.             var j = i, value = this[i];
  35.             while (j > 0 && this[j - 1] > value)
  36.             {
  37.                 this[j] = this[j - 1];
  38.                 --j;
  39.             }
  40.             this[j] = value;
  41.         }
  42.     }

  43.     Array.prototype.shellSort = function()
  44.     {
  45.         for (var step = this.length >> 1; step > 0; step >>= 1)
  46.         {
  47.             for (var i = 0; i < step; ++i)
  48.             {
  49.                 for (var j = i + step; j < this.length; j += step)
  50.                 {
  51.                     var k = j, value = this[j];
  52.                     while (k >= step && this[k - step] > value)
  53.                     {
  54.                         this[k] = this[k - step];
  55.                         k -= step;
  56.                     }
  57.                     this[k] = value;
  58.                 }
  59.             }
  60.         }
  61.     }

  62.     Array.prototype.quickSort = function(s, e)
  63.     {
  64.         if (s == null) s = 0;
  65.         if (e == null) e = this.length - 1;
  66.         if (s >= e) return;
  67.         this.swap((s + e) >> 1, e);
  68.         var index = s - 1;
  69.         for (var i = s; i <= e; ++i)
  70.         {
  71.             if (this[i] <= this[e]) this.swap(i, ++index);
  72.         }
  73.         this.quickSort(s, index - 1);
  74.         this.quickSort(index + 1, e);
  75.     }

  76.     Array.prototype.stackQuickSort = function()
  77.     {
  78.         var stack = [0, this.length - 1];
  79.         while (stack.length > 0)
  80.         {
  81.             var e = stack.pop(), s = stack.pop();
  82.             if (s >= e) continue;
  83.             this.swap((s + e) >> 1, e);
  84.             var index = s - 1;
  85.             for (var i = s; i <= e; ++i)
  86.             {
  87.                 if (this[i] <= this[e]) this.swap(i, ++index);
  88.             }
  89.             stack.push(s, index - 1, index + 1, e);
  90.         }
  91.     }

  92.     Array.prototype.mergeSort = function(s, e, b)
  93.     {
  94.         if (s == null) s = 0;
  95.         if (e == null) e = this.length - 1;
  96.         if (b == null) b = new Array(this.length);
  97.         if (s >= e) return;
  98.         var m = (s + e) >> 1;
  99.         this.mergeSort(s, m, b);
  100.         this.mergeSort(m + 1, e, b);
  101.         for (var i = s, j = s, k = m + 1; i <= e; ++i)
  102.         {
  103.             b[i] = this[(k > e || j <= m && this[j] < this[k]) ? j++ : k++];
  104.         }
  105.         for (var i = s; i <= e; ++i) this[i] = b[i];
  106.     }

  107.     Array.prototype.heapSort = function()
  108.     {
  109.         for (var i = 1; i < this.length; ++i)
  110.         {
  111.             for (var j = i, k = (j - 1) >> 1; k >= 0; j = k, k = (k - 1) >> 1)
  112.             {
  113.                 if (this[k] >= this[j]) break;
  114.                 this.swap(j, k);
  115.             }
  116.         }
  117.         for (var i = this.length - 1; i > 0; --i)
  118.         {
  119.             this.swap(0, i);
  120.             for (var j = 0, k = (j + 1) << 1; k <= i; j = k, k = (k + 1) << 1)
  121.             {
  122.                 if (k == i || this[k] < this[k - 1]) --k;
  123.                 if (this[k] <= this[j]) break;
  124.                 this.swap(j, k);
  125.             }
  126.         }
  127.     }

  128.     function generate()
  129.     {
  130.         var max = parseInt(txtMax.value), count = parseInt(txtCount.value);
  131.         if (isNaN(max) || isNaN(count))
  132.         {
  133.             alert("个数和最大值必须是一个整数");
  134.             return;
  135.         }
  136.         var array = [];
  137.         for (var i = 0; i < count; ++i) array.push(Math.round(Math.random() * max));
  138.         txtInput.value = array.join("\n");
  139.         txtOutput.value = "";
  140.     }

  141.     function demo(type)
  142.     {
  143.         var array = txtInput.value == "" ? [] : txtInput.value.replace().split("\n");
  144.         for (var i = 0; i < array.length; ++i) array[i] = parseInt(array[i]);
  145.         var t1 = new Date();
  146.         eval("array." + type + "Sort()");
  147.         var t2 = new Date();
  148.         lblTime.innerText = t2.valueOf() - t1.valueOf();
  149.         txtOutput.value = array.join("\n");
  150.     }
  151. </script>

  152. <body onload=generate()>
  153. <table style="width:100%;height:100%;font-size:12px;font-family:宋体">
  154. <tr>
  155.     <td align=right>
  156.         <textarea id=txtInput readonly style="width:100px;height:100%"></textarea>
  157.     </td>
  158.     <td width=150 align=center>
  159.         随机数个数<input id=txtCount value=500 style="width:50px"><br><br>
  160.         最大随机数<input id=txtMax value=1000 style="width:50px"><br><br>
  161.         <button onclick=generate()>重新生成</button><br><br><br><br>
  162.         耗时(毫秒):<label id=lblTime></label><br><br><br><br>
  163.         <button onclick=demo("bubble")>冒泡排序</button><br><br>
  164.         <button onclick=demo("selection")>选择排序</button><br><br>
  165.         <button onclick=demo("insertion")>插入排序</button><br><br>
  166.         <button onclick=demo("shell")>谢尔排序</button><br><br>
  167.         <button onclick=demo("quick")>快速排序(递归)</button><br><br>
  168.         <button onclick=demo("stackQuick")>快速排序(堆栈)</button><br><br>
  169.         <button onclick=demo("merge")>归并排序</button><br><br>
  170.         <button onclick=demo("heap")>堆排序</button><br><br>
  171.     </td>
  172.     <td align=left>
  173.         <textarea id=txtOutput readonly style="width:100px;height:100%"></textarea>
  174.     </td>
  175. </tr>
  176. </table>
  177. </body>
复制代码运行代码另存代码

Rank: 4

升级  36.6%

注册时间
2004-6-9
威望
416
阅读权限
50
积分
683
帖子
417
精华
0
UID
12722
状态
当前离线
发表于 2006-2-21 22:43:00 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
很实用,收了

使用道具 举报

Rank: 3Rank: 3

升级  49.67%

注册时间
2005-10-24
威望
204
阅读权限
30
积分
349
帖子
202
精华
0
UID
40052
状态
当前离线
发表于 2006-2-22 10:47:17 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
引用内容由 microsopht 发表于 2006-2-21 20:14
JS在这方面的效率比 C++、Java 还是要差很多地……

不是语言的问题

使用道具 举报

Rank: 6Rank: 6

升级  60.6%

注册时间
2005-11-13
威望
1370
阅读权限
70
积分
2212
帖子
1391
精华
1
UID
41131
状态
当前离线
发表于 2006-2-22 13:26:37 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ Yahoo!
晕!用谢尔和冒泡效率相差这么多啊!差50倍啊!这是什么算法,太强了吧!

使用道具 举报

Rank: 6Rank: 6

升级  28.5%

注册时间
2004-5-16
威望
875
阅读权限
70
积分
1570
帖子
837
精华
1
UID
11533
状态
当前离线
发表于 2006-3-5 21:41:03 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
引用内容由 无殇 发表于 2006-2-22 01:26 PM
晕!用谢尔和冒泡效率相差这么多啊!差50倍啊!这是什么算法,太强了吧!

相对来说,希尔排序比冒泡排序效率本来就要高些,所以用时差50倍我觉得很正常~!

使用道具 举报

Rank: 3Rank: 3

升级  29%

注册时间
2003-7-30
威望
148
阅读权限
30
积分
287
帖子
152
精华
0
UID
4683
状态
当前离线
发表于 2006-9-8 10:11:40 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
学到一招。

使用道具 举报

超级版主

新手上路

Rank: 8Rank: 8

注册时间
2004-5-22
威望
3336
阅读权限
150
积分
6241
帖子
3329
精华
3
UID
11749
状态
当前离线
发表于 2006-9-8 11:21:06 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 查看个人网站
一招都没学到,留着先……
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)

使用道具 举报

Rank: 6Rank: 6

升级  7.15%

注册时间
2005-8-24
威望
581
阅读权限
70
积分
1143
帖子
611
精华
0
UID
35854
状态
当前离线
发表于 2006-9-8 22:48:46 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ
很让我郁闷 能运行 与运行好的区别。

使用道具 举报

Rank: 3Rank: 3

升级  17.67%

注册时间
2005-11-9
威望
131
阅读权限
30
积分
253
帖子
111
精华
0
UID
40708
状态
当前离线
发表于 2006-9-25 14:36:25 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
谢谢,先收了再看,很有价值啊!

使用道具 举报

Rank: 2

升级  59.33%

注册时间
2004-5-28
威望
76
阅读权限
20
积分
139
帖子
61
精华
0
UID
12040
状态
当前离线
发表于 2007-1-7 01:18:44 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ
正在找这个呢
高薪招聘ajax工程师(北京), msn:cntui@msn.com, mobile: 13161851280

使用道具 举报

霸王龙

网恋? 妄念!

Rank: 6Rank: 6

升级  63.35%

注册时间
2007-3-27
威望
1203
阅读权限
70
积分
2267
帖子
1268
精华
0
UID
67036
状态
当前离线
发表于 2007-4-3 08:50:45 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ
太强了 各种排序都全了
"我要印"印刷商务平台     和我聊聊
自从一见桃花后,直至如今更不疑!

使用道具 举报

Rank: 4

升级  14.2%

注册时间
2004-8-15
威望
218
阅读权限
50
积分
571
帖子
216
精华
0
UID
15602
状态
当前离线
发表于 2007-4-17 02:49:58 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
收藏。以后再研究。

使用道具 举报

Rank: 6Rank: 6

升级  5.5%

注册时间
2006-8-17
威望
272
阅读权限
70
积分
1110
帖子
496
精华
0
UID
55510
状态
当前离线
发表于 2007-4-17 06:56:32 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
发呆中。。。

使用道具 举报

Rank: 3Rank: 3

升级  33.33%

注册时间
2006-11-3
威望
138
阅读权限
30
积分
300
帖子
141
精华
0
UID
58736
状态
当前离线
发表于 2007-4-17 11:26:58 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ
呵呵,正在找呢.

使用道具 举报

Rank: 1

升级  68%

注册时间
2007-11-3
威望
11
阅读权限
10
积分
34
帖子
11
精华
0
UID
78294
状态
当前离线
发表于 2007-11-6 20:37:24 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ
就凭这一贴我加入51JS,果然有不错的朋友。

使用道具 举报

Rank: 2

升级  46%

注册时间
2007-11-8
威望
47
阅读权限
20
积分
119
帖子
59
精华
0
UID
78574
状态
当前离线
发表于 2007-12-13 00:53:40 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
收藏,研究

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-12-13 01:12:46 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
哈哈 怎么看起来都这么短呢 印象中几个排序都挺长来着:lol

使用道具 举报

Rank: 3Rank: 3

升级  10.33%

注册时间
2007-10-27
威望
40
阅读权限
30
积分
231
帖子
42
精华
0
UID
77906
状态
当前离线
发表于 2007-12-13 10:28:25 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
呵呵,以前学算法的时候,写过这个,路过顶帖留名:loveliness:

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-12-13 14:11:18 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
俺好像是数据结构学的排序:loveliness:

使用道具 举报

Rank: 2

升级  3.33%

注册时间
2004-4-10
威望
37
阅读权限
20
积分
55
帖子
19
精华
0
UID
10408
状态
当前离线
发表于 2007-12-13 14:19:22 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
有个详细的注释就更好了

使用道具 举报

您需要登录后才可以回帖 登录 | 加入无忧

Archiver|手机版|无忧脚本 ( 苏ICP备05080427号 )|值班电话:027-62300445  

GMT+8, 2012-2-7 21:33 , Processed in 0.067601 second(s), 15 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 1999-2011 无忧脚本

回顶部