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 Array.remove() 数组删除
Aug 06 Javascript
javascript数组去重3种方法的性能测试与比较
Mar 26 Javascript
Javascript设计模式之观察者模式(推荐)
Mar 29 Javascript
input框中的name和id的区别
Nov 16 Javascript
详解javascript appendChild()的完整功能
Aug 18 Javascript
jQuery实现基本淡入淡出效果的方法详解
Sep 05 jQuery
layer弹出子iframe层父子页面传值的实现方法
Nov 22 Javascript
详解javascript对数组和json数组的操作
Apr 15 Javascript
原生js通过一行代码实现简易轮播图
Jun 05 Javascript
vue 监听 Treeselect 选择项的改变操作
Aug 31 Javascript
Openlayers显示地理位置坐标的方法
Sep 28 Javascript
ES6 十大特性简介
Dec 09 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 多个submit提交表单 处理方法
2009/07/07 PHP
php木马webshell扫描器代码
2012/01/25 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
php实现aes加密类分享
2014/02/16 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
常用PHP封装分页工具类
2017/01/14 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python3.6简单反射操作示例
2018/06/14 Python
python读取LMDB中图像的方法
2018/07/02 Python
python判断输入日期为第几天的实例
2018/11/13 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
英国最大的海报商店:GB Posters
2018/03/20 全球购物
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
幼儿园园长岗位职责
2013/11/26 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
立项申请报告范本
2015/05/15 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书