linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > JavaScript >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·javascript 时间对象的格式化
·去掉字符串前后的空格
·javascript 事件监听机制
·javascript 事件调用顺序
·js刷新框架子页面的七种方法
·JavaScript:替换字符串
·IE下的JScript编程需注意的内存
·用javascript操作word文档
·Javascript中CTRL+回车提交表单
·JS 获取鼠标位置
·javascript判断Email地址是否有
·Javascript中Select的OnChange
·JS实现的滑动展开与折叠效果
·有分页功能的WEB打印
·Javascript实现窗口最大化的严
最新文章
·使用CSS改变表格边框样式
·为网页添加浮动广告
·判断表单中添加是否数字的JS与
·让浏览器状态栏动起来
·使用Javascript制作行间颜色间
·禁止用右键查看源代码
·网页侦测四法
·制作弹出公告窗口
·为网页添加特效
·网页中取消鼠标右键方法大全
·JavaScript 根据屏幕解析度显示
·如何实现浏览器上的右键菜单
·如何制作浮动广告
·让弹出窗口变得“体贴”一些
·JavaScript技巧:让网页自动穿上
Google
 
javascript 的几种排序方法
[ 作者:  加入时间:2008-02-18 11:00:56  来自:Linux联盟收集整理 ]
所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下:SbcLinux联盟
  输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn。SbcLinux联盟
  输出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。

    这里,我们简单介绍几种排序方法,直接插入排序、希儿排序、冒泡排序、快速排序、直接选择排序,文中所提及的代码在IE6下测试通过。

直接插入排序基本思想

    假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。

    算法描述SbcLinux联盟

 function InsertSort(arr) { //插入排序->直接插入法排序SbcLinux联盟
  var st = new Date();SbcLinux联盟
  var temp, j;SbcLinux联盟
  for(var i=1; i<arr.length; i++) {SbcLinux联盟
   if((arr[i]) < (arr[i-1])) {SbcLinux联盟
    temp = arr[i];SbcLinux联盟
    j = i-1;SbcLinux联盟
    do {SbcLinux联盟
     arr[j+1] = arr[j];SbcLinux联盟
     j--;SbcLinux联盟
    }SbcLinux联盟
    while (j>-1 && (temp) < (arr[j]));SbcLinux联盟
    arr[j+1] = temp;SbcLinux联盟
   }//endifSbcLinux联盟
  }SbcLinux联盟
  status = (new Date() - st) + ' ms';SbcLinux联盟
  return arr;SbcLinux联盟
 }SbcLinux联盟

希尔排序基本思想

   先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。SbcLinux联盟
   该方法实质上是一种分组插入方法。

    算法描述

 function ShellSort(arr) { //插入排序->希儿排序SbcLinux联盟
  var st = new Date();SbcLinux联盟
  var increment = arr.length;SbcLinux联盟
  do {SbcLinux联盟
   increment = (increment/3|0) + 1;SbcLinux联盟
   arr = ShellPass(arr, increment);SbcLinux联盟
  }SbcLinux联盟
  while (increment > 1)SbcLinux联盟
  status = (new Date() - st) + ' ms';SbcLinux联盟
  return arr;SbcLinux联盟
 }SbcLinux联盟
 function ShellPass(arr, d) { //希儿排序分段执行函数SbcLinux联盟
  var temp, j;SbcLinux联盟
  for(var i=d; i<arr.length; i++) {SbcLinux联盟
   if((arr[i]) < (arr[i-d])) {SbcLinux联盟
    temp = arr[i]; j = i-d;SbcLinux联盟
    do {SbcLinux联盟
     arr[j+d] = arr[j];SbcLinux联盟
     j = j-d;SbcLinux联盟
    }SbcLinux联盟
    while (j>-1 && (temp) < (arr[j]));SbcLinux联盟
    arr[j+d] = temp;SbcLinux联盟
   }//endifSbcLinux联盟
  }SbcLinux联盟
  return arr;SbcLinux联盟
 }

冒泡排序基本思想

    将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

SbcLinux联盟
    算法描述SbcLinux联盟

 function BubbleSort(arr) { //交换排序->冒泡排序SbcLinux联盟
  var st = new Date();SbcLinux联盟
  var temp;SbcLinux联盟
  var exchange;SbcLinux联盟
  for(var i=0; i<arr.length; i++) {SbcLinux联盟
   exchange = false;SbcLinux联盟
   for(var j=arr.length-2; j>=i; j--) {SbcLinux联盟
    if((arr[j+1]) < (arr[j])) {SbcLinux联盟
     temp = arr[j+1];SbcLinux联盟
     arr[j+1] = arr[j];SbcLinux联盟
     arr[j] = temp;SbcLinux联盟
     exchange = true;SbcLinux联盟
    }SbcLinux联盟
   }SbcLinux联盟
   if(!exchange) break;SbcLinux联盟
  }SbcLinux联盟
  status = (new Date() - st) + ' ms';SbcLinux联盟
  return arr;SbcLinux联盟
 }

快速排序基本思想

    将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。SbcLinux联盟
    在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。

    算法描述SbcLinux联盟

 function QuickSort(arr) { //交换排序->快速排序SbcLinux联盟
  if (arguments.length>1) {SbcLinux联盟
   var low = arguments[1];SbcLinux联盟
   var high = arguments[2];SbcLinux联盟
  } else {SbcLinux联盟
   var low = 0;SbcLinux联盟
   var high = arr.length-1;SbcLinux联盟
  }SbcLinux联盟
  if(low < high){SbcLinux联盟
   // function PartitionSbcLinux联盟
   var i = low;SbcLinux联盟
   var j = high;SbcLinux联盟
   var pivot = arr[i];SbcLinux联盟
   while(i<j) {SbcLinux联盟
    while(i<j && arr[j]>=pivot)SbcLinux联盟
     j--;SbcLinux联盟
    if(i<j)SbcLinux联盟
     arr[i++] = arr[j];SbcLinux联盟
    while(i<j && arr[i]<=pivot)SbcLinux联盟
     i++;SbcLinux联盟
    if(i<j)SbcLinux联盟
     arr[j--] = arr[i];SbcLinux联盟
   }//endwhileSbcLinux联盟
   arr[i] = pivot;SbcLinux联盟
   // end functionSbcLinux联盟
   var pivotpos = i; //Partition(arr,low,high);SbcLinux联盟
   QuickSort(arr, low, pivotpos-1);SbcLinux联盟
   QuickSort(arr, pivotpos+1, high);SbcLinux联盟
  } elseSbcLinux联盟
   return;SbcLinux联盟
   return arr;SbcLinux联盟
 }

直接选择排序基本思想

   n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:SbcLinux联盟
 ①初始状态:无序区为R[1..n],有序区为空。SbcLinux联盟
 ②第1趟排序SbcLinux联盟
    在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。SbcLinux联盟
  ……SbcLinux联盟
 ③第i趟排序SbcLinux联盟
  第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R[i..n](1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。SbcLinux联盟
    这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

    算法描述SbcLinux联盟

 function SelectSort(arr) { //选择排序->直接选择排序SbcLinux联盟
  var st = new Date();SbcLinux联盟
  var temp;SbcLinux联盟
  for(var i=0; i<arr.length; i++) {SbcLinux联盟
   var k = i;SbcLinux联盟
   for(var j=i+1; j<arr.length; j++) {SbcLinux联盟
    if((arr[j]) < (arr[k]))SbcLinux联盟
     k = j;SbcLinux联盟
   }SbcLinux联盟
   if (k != i){SbcLinux联盟
    temp = arr[i];SbcLinux联盟
    arr[i] = arr[k];SbcLinux联盟
    arr[k] = temp;SbcLinux联盟
   }SbcLinux联盟
  }SbcLinux联盟
  status = (new Date() - st) + ' ms';SbcLinux联盟
  return arr;SbcLinux联盟
 }

SbcLinux联盟
 

<style>SbcLinux联盟
fieldset {SbcLinux联盟
 font-size:12px;SbcLinux联盟
 padding:10px;SbcLinux联盟
 width:80%;SbcLinux联盟
 margin:auto;SbcLinux联盟
}SbcLinux联盟
input {SbcLinux联盟
 font-size:12px;SbcLinux联盟
 font-family:Tahoma;SbcLinux联盟
}SbcLinux联盟
</style>SbcLinux联盟
<title>排序</title><h3 align="center">排序</h3><fieldset>SbcLinux联盟
<legend>插入排序</legend><p><b>直接插入排序</b>SbcLinux联盟
请输入一段要排序的字符,用半角逗号隔开SbcLinux联盟
<input name=insert type=text size=100 value="g,v,u,f,p,o,i,a,t,j,e,l,k">SbcLinux联盟
<br><input type=button value=" 排序 " onclick="alert(InsertSort(insert.value.split(',')));"><p><b>希儿排序</b><br>  <input name=Shell type=text size=100 value="g,v,u,f,p,o,i,a,t,j">SbcLinux联盟
<br><input type=button value=" 排序 " onclick="alert(ShellSort(Shell.value.split(',')));"></fieldset><p><fieldset><legend>交换排序</legend><b>冒泡排序</b><br>SbcLinux联盟
<input name=bubble type=text size=100 value="g,v,u,f,p,o,i,a,t,j,e,l,k">SbcLinux联盟
<br><input type=button value=" 排序 " onclick="alert(BubbleSort(bubble.value.split(',')));"><p><b>快速排序<br></b>  <input name=quick type=text size=100 value="3,1,5,4,6">SbcLinux联盟
<br><input type=button value=" 排序 " onclick="alert(QuickSortDemo(quick.value.split(',')));"></fieldset><p><fieldset>SbcLinux联盟
<legend>选择排序</legend><b>直接选择排序</b><br>SbcLinux联盟
<input name=select1 type=text size=100 value="g,v,u,f,p,o,i,a,t,j,e,l,k">SbcLinux联盟
<br><input type=button value=" 排序 " onclick="alert(SelectSort(select1.value.split(',')));"><p>... ...</fieldset><script>SbcLinux联盟
 function InsertSort(arr) { //插入排序->直接插入法排序SbcLinux联盟
  var st = new Date();SbcLinux联盟
  var temp, j;SbcLinux联盟
  for(var i=1; i<arr.length; i++) {SbcLinux联盟
   if((arr[i]) < (arr[i-1])) {SbcLinux联盟
    temp = arr[i];SbcLinux联盟
    j = i-1;SbcLinux联盟
    do {SbcLinux联盟
     arr[j+1] = arr[j];SbcLinux联盟
     j--;SbcLinux联盟
    }SbcLinux联盟
    while (j>-1 && (temp) < (arr[j]));SbcLinux联盟
    arr[j+1] = temp;SbcLinux联盟
   }//endifSbcLinux联盟
  }SbcLinux联盟
  status = (new Date() - st) + ' ms';SbcLinux联盟
  return arr;SbcLinux联盟
 }SbcLinux联盟
SbcLinux联盟
 function ShellSort(arr) { //插入排序->希儿排序SbcLinux联盟
  var st = new Date();SbcLinux联盟
  var increment = arr.length;SbcLinux联盟
  do {SbcLinux联盟
   increment = (increment/3|0) + 1;SbcLinux联盟
   arr = ShellPass(arr, increment);SbcLinux联盟
  }SbcLinux联盟
  while (increment > 1)SbcLinux联盟
  status = (new Date() - st) + ' ms';SbcLinux联盟
  return arr;SbcLinux联盟
 }SbcLinux联盟
SbcLinux联盟
 function ShellPass(arr, d) { //希儿排序分段执行函数SbcLinux联盟
  var temp, j;SbcLinux联盟
  for(var i=d; i<arr.length; i++) {SbcLinux联盟
   if((arr[i]) < (arr[i-d])) {SbcLinux联盟
    temp = arr[i]; j = i-d;SbcLinux联盟
    do {SbcLinux联盟
     arr[j+d] = arr[j];SbcLinux联盟
     j = j-d;SbcLinux联盟
    }SbcLinux联盟
    while (j>-1 && (temp) < (arr[j]));SbcLinux联盟
    arr[j+d] = temp;SbcLinux联盟
   }//endifSbcLinux联盟
  }SbcLinux联盟
  return arr;SbcLinux联盟
 }SbcLinux联盟
SbcLinux联盟
 function BubbleSort(arr) { //交换排序->冒泡排序SbcLinux联盟
  var st = new Date();SbcLinux联盟
  var temp;SbcLinux联盟
  var exchange;SbcLinux联盟
  for(var i=0; i<arr.length; i++) {SbcLinux联盟
   exchange = false;SbcLinux联盟
   for(var j=arr.length-2; j>=i; j--) {SbcLinux联盟
    if((arr[j+1]) < (arr[j])) {SbcLinux联盟
     temp = arr[j+1];SbcLinux联盟
     arr[j+1] = arr[j];SbcLinux联盟
     arr[j] = temp;SbcLinux联盟
     exchange = true;SbcLinux联盟
    }SbcLinux联盟
   }SbcLinux联盟
   if(!exchange) break;SbcLinux联盟
  }SbcLinux联盟
  status = (new Date() - st) + ' ms';SbcLinux联盟
  return arr;SbcLinux联盟
 }SbcLinux联盟
SbcLinux联盟
 function QuickSortDemo(arr) {SbcLinux联盟
  var st = new Date();SbcLinux联盟
  var result = QuickSort(arr);SbcLinux联盟
  status = (new Date() - st) + ' ms';SbcLinux联盟
  return result;SbcLinux联盟
 } SbcLinux联盟
SbcLinux联盟
 function QuickSort(arr) { //交换排序->快速排序SbcLinux联盟
  if (arguments.length>1) {SbcLinux联盟
   var low = arguments[1];SbcLinux联盟
   var high = arguments[2];SbcLinux联盟
  } else {SbcLinux联盟
   var low = 0;SbcLinux联盟
   var high = arr.length-1;SbcLinux联盟
  }SbcLinux联盟
  if(low < high){SbcLinux联盟
   // function PartitionSbcLinux联盟
   var i = low;SbcLinux联盟
   var j = high;SbcLinux联盟
   var pivot = arr[i];SbcLinux联盟
   while(i<j) {SbcLinux联盟
    while(i<j && arr[j]>=pivot)SbcLinux联盟
     j--;SbcLinux联盟
    if(i<j)SbcLinux联盟
     arr[i++] = arr[j];SbcLinux联盟
    while(i<j && arr[i]<=pivot)SbcLinux联盟
     i++;SbcLinux联盟
    if(i<j)SbcLinux联盟
     arr[j--] = arr[i];SbcLinux联盟
   }//endwhileSbcLinux联盟
   arr[i] = pivot;SbcLinux联盟
   // end functionSbcLinux联盟
   var pivotpos = i; //Partition(arr,low,high);SbcLinux联盟
   QuickSort(arr, low, pivotpos-1);SbcLinux联盟
   QuickSort(arr, pivotpos+1, high);SbcLinux联盟
  } elseSbcLinux联盟
   return;SbcLinux联盟
   return arr;SbcLinux联盟
 }SbcLinux联盟
 SbcLinux联盟
 /*function Partition(arr, i, j) { //快速排序, 对待排序的数组进行划分SbcLinux联盟
  var pivot = arr[i];SbcLinux联盟
  while(i<j) {SbcLinux联盟
   while(arr[j]>=pivot)SbcLinux联盟
    j--;SbcLinux联盟
   if(i<j)SbcLinux联盟
    arr[i++] = arr[j];SbcLinux联盟
   while(arr[i]<=pivot)SbcLinux联盟
    i++;SbcLinux联盟
   if(i<j)SbcLinux联盟
    arr[j--] = arr[i];SbcLinux联盟
  }SbcLinux联盟
  arr[i] = pivot;SbcLinux联盟
  return arr;SbcLinux联盟
 }*/SbcLinux联盟
SbcLinux联盟
 function SelectSort(arr) { //选择排序->直接选择排序SbcLinux联盟
  var st = new Date();SbcLinux联盟
  var temp;SbcLinux联盟
  for(var i=0; i<arr.length; i++) {SbcLinux联盟
   var k = i;SbcLinux联盟
   for(var j=i+1; j<arr.length; j++) {SbcLinux联盟
    if((arr[j]) < (arr[k]))SbcLinux联盟
     k = j;SbcLinux联盟
   }SbcLinux联盟
   if (k != i){SbcLinux联盟
    temp = arr[i];SbcLinux联盟
    arr[i] = arr[k];SbcLinux联盟
    arr[k] = temp;SbcLinux联盟
   }SbcLinux联盟
  }SbcLinux联盟
  status = (new Date() - st) + ' ms';SbcLinux联盟
  return arr;SbcLinux联盟
 }SbcLinux联盟
SbcLinux联盟
  function unicode(str) {//求字符串的unicode码SbcLinux联盟
  var uni=0;SbcLinux联盟
  for(var i=0; i<str.length; i++){SbcLinux联盟
   uni += str.charCodeAt(i)/6553.5 * Math.pow(10, str.length-i);SbcLinux联盟
  }SbcLinux联盟
  return uni;SbcLinux联盟
 }SbcLinux联盟
</script>

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·岂今我看过的最强的排序算法  (2007-12-13 15:54:05)
 ·网页里嵌入JavaScript 验证空,汉字,字母,数字长度输入  (2007-11-30 13:12:48)
 ·javascript 常用代码大全  (2007-11-30 13:03:07)
 ·给datagrid控件建立稳固的双向排序(asp.net)  (2007-11-27 16:58:03)
 ·Javascript Tip(1) 操作剪贴板  (2007-11-23 14:03:27)
 ·典型Datagrid分页、排序、删除代码  (2007-11-20 17:08:55)
 ·实用的Javascript类库表格排序  (2007-11-16 17:00:11)
 ·双击DBGrid标题栏排序  (2007-11-05 17:42:23)
 ·在DELPHI中用线程排序  (2007-10-30 15:41:06)
 ·JavaScript 访问 JSF 组件的方法  (2007-10-30 14:18:21)