js常用排序实现代码


Posted in Javascript onDecember 28, 2010
<script> 
Array.prototype.swap = function(i, j) 
{ 
var temp = this[i]; 
this[i] = this[j]; 
this[j] = temp; 
} Array.prototype.bubbleSort = function() 
{ 
for (var i = this.length - 1; i > 0; --i) 
{ 
for (var j = 0; j < i; ++j) 
{ 
if (this[j] > this[j + 1]) this.swap(j, j + 1); 
} 
} 
} 
Array.prototype.selectionSort = function() 
{ 
for (var i = 0; i < this.length; ++i) 
{ 
var index = i; 
for (var j = i + 1; j < this.length; ++j) 
{ 
if (this[j] < this[index]) index = j; 
} 
this.swap(i, index); 
} 
} 
Array.prototype.insertionSort = function() 
{ 
for (var i = 1; i < this.length; ++i) 
{ 
var j = i, value = this[i]; 
while (j > 0 && this[j - 1] > value) 
{ 
this[j] = this[j - 1]; 
--j; 
} 
this[j] = value; 
} 
} 
Array.prototype.shellSort = function() 
{ 
for (var step = this.length >> 1; step > 0; step >>= 1) 
{ 
for (var i = 0; i < step; ++i) 
{ 
for (var j = i + step; j < this.length; j += step) 
{ 
var k = j, value = this[j]; 
while (k >= step && this[k - step] > value) 
{ 
this[k] = this[k - step]; 
k -= step; 
} 
this[k] = value; 
} 
} 
} 
} 
Array.prototype.quickSort = function(s, e) 
{ 
if (s == null) s = 0; 
if (e == null) e = this.length - 1; 
if (s >= e) return; 
this.swap((s + e) >> 1, e); 
var index = s - 1; 
for (var i = s; i <= e; ++i) 
{ 
if (this[i] <= this[e]) this.swap(i, ++index); 
} 
this.quickSort(s, index - 1); 
this.quickSort(index + 1, e); 
} 
Array.prototype.stackQuickSort = function() 
{ 
var stack = [0, this.length - 1]; 
while (stack.length > 0) 
{ 
var e = stack.pop(), s = stack.pop(); 
if (s >= e) continue; 
this.swap((s + e) >> 1, e); 
var index = s - 1; 
for (var i = s; i <= e; ++i) 
{ 
if (this[i] <= this[e]) this.swap(i, ++index); 
} 
stack.push(s, index - 1, index + 1, e); 
} 
} 
Array.prototype.mergeSort = function(s, e, b) 
{ 
if (s == null) s = 0; 
if (e == null) e = this.length - 1; 
if (b == null) b = new Array(this.length); 
if (s >= e) return; 
var m = (s + e) >> 1; 
this.mergeSort(s, m, b); 
this.mergeSort(m + 1, e, b); 
for (var i = s, j = s, k = m + 1; i <= e; ++i) 
{ 
b[i] = this[(k > e || j <= m && this[j] < this[k]) ? j++ : k++]; 
} 
for (var i = s; i <= e; ++i) this[i] = b[i]; 
} 
Array.prototype.heapSort = function() 
{ 
for (var i = 1; i < this.length; ++i) 
{ 
for (var j = i, k = (j - 1) >> 1; k >= 0; j = k, k = (k - 1) >> 1) 
{ 
if (this[k] >= this[j]) break; 
this.swap(j, k); 
} 
} 
for (var i = this.length - 1; i > 0; --i) 
{ 
this.swap(0, i); 
for (var j = 0, k = (j + 1) << 1; k <= i; j = k, k = (k + 1) << 1) 
{ 
if (k == i || this[k] < this[k - 1]) --k; 
if (this[k] <= this[j]) break; 
this.swap(j, k); 
} 
} 
} 
function generate() 
{ 
var max = parseInt(txtMax.value), count = parseInt(txtCount.value); 
if (isNaN(max) || isNaN(count)) 
{ 
alert("个数和最大值必须是一个整数"); 
return; 
} 
var array = []; 
for (var i = 0; i < count; ++i) array.push(Math.round(Math.random() * max)); 
txtInput.value = array.join("\n"); 
txtOutput.value = ""; 
} 
function demo(type) 
{ 
var array = txtInput.value == "" ? [] : txtInput.value.replace().split("\n"); 
for (var i = 0; i < array.length; ++i) array[i] = parseInt(array[i]); 
var t1 = new Date(); 
eval("array." + type + "Sort()"); 
var t2 = new Date(); 
lblTime.innerText = t2.valueOf() - t1.valueOf(); 
txtOutput.value = array.join("\n"); 
} 
</script> 
<body onload=generate()> 
<table style="width:100%;height:100%;font-size:12px;font-family:宋体"> 
<tr> 
<td align=right> 
<textarea id=txtInput readonly style="width:100px;height:100%"></textarea> 
</td> 
<td width=150 align=center> 
随机数个数<input id=txtCount value=500 style="width:50px"><br><br> 
最大随机数<input id=txtMax value=1000 style="width:50px"><br><br> 
<button onclick=generate()>重新生成</button><br><br><br><br> 
耗时(毫秒):<label id=lblTime></label><br><br><br><br> 
<button onclick=demo("bubble")>冒泡排序</button><br><br> 
<button onclick=demo("selection")>选择排序</button><br><br> 
<button onclick=demo("insertion")>插入排序</button><br><br> 
<button onclick=demo("shell")>谢尔排序</button><br><br> 
<button onclick=demo("quick")>快速排序(递归)</button><br><br> 
<button onclick=demo("stackQuick")>快速排序(堆栈)</button><br><br> 
<button onclick=demo("merge")>归并排序</button><br><br> 
<button onclick=demo("heap")>堆排序</button><br><br> 
</td> 
<td align=left> 
<textarea id=txtOutput readonly style="width:100px;height:100%"></textarea> 
</td> 
</tr> 
</table> 
</body>
Javascript 相关文章推荐
理解Javascript_01_理解内存分配原理分析
Oct 11 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
Nov 30 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
Jul 09 Javascript
JQuery fileupload插件实现文件上传功能
Mar 18 Javascript
jquery滚动条插件(可以自定义)
Dec 11 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
Mar 03 Javascript
关于Javascript中document.cookie的使用
Mar 08 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
基于bootstrop常用类总结(推荐)
Sep 11 Javascript
在vue中使用vue-echarts-v3的实例代码
Sep 13 Javascript
深入了解query和params的使用区别
Jun 24 Javascript
js中复选框的取值及赋值示例详解
Oct 18 Javascript
深入理解Javascript闭包 新手版
Dec 28 #Javascript
prettify 代码高亮着色器google出品
Dec 28 #Javascript
Pro JavaScript Techniques学习笔记
Dec 28 #Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
Dec 28 #Javascript
JavaScript动态调整TextArea高度的代码
Dec 28 #Javascript
JavaScript性能陷阱小结(附实例说明)
Dec 28 #Javascript
javascript写的日历类(基于pj)
Dec 28 #Javascript
You might like
php数组中删除元素之重新索引的方法
2014/09/16 PHP
PHP实现微信发红包程序
2015/08/24 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
php微信公众号开发模式详解
2016/11/28 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
js简单设置与使用cookie的方法
2016/01/22 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
python实现简单爬虫功能的示例
2016/10/24 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
python实时监控logstash日志代码
2020/04/27 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
中科前程Java笔试题
2016/11/20 面试题
师范生实习自我鉴定
2013/11/01 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
Redis中一个String类型引发的惨案
2021/07/25 Redis