排序代码。在示例下500条数据时,效率提高50%的得分。(代码不必拘限于示例代码)

JK_10000 2007-08-09 01:41:35
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JK:支持民族工业,尽量少买X货</title>
<script language="javascript" srccccc="CommonJS_RowSort.js">
var rowSortImg=document.createElement("img");
function rowSortFun(tdObj){
var d1=new Date();
var currentColumnIndex=tdObj.cellIndex;
if(rowSortImg.parentNode != tdObj){
tdObj.appendChild(rowSortImg);
rowSortImg.src="up.gif";
}
else if (rowSortImg.src.indexOf("down.gif")>-1){
rowSortImg.src="up.gif";
}
else{
rowSortImg.src="down.gif";
}
var currentTbody=tdObj.parentNode.parentNode;
var rowsArray=new Array();
for( var i=1;i<currentTbody.rows.length;i++){
rowsArray[i-1]=currentTbody.rows[i].cells[currentColumnIndex];
}
rowsArray.sort(getSortFun(tdObj));
for(var i=0;i<rowsArray.length;i++){
currentTbody.appendChild(rowsArray[i].parentNode);
}
alert("行数"+rowsArray.length+";所花毫秒数"+(new Date()-d1));
}

function getSortFun(tdObj){
var sortIsAsc=(rowSortImg.src.indexOf("up.gif")>-1);
if("Number"==tdObj.columnContentType && sortIsAsc){
return function (trObj1,trObj2) {return trObj1.innerHTML*1-trObj2.innerHTML*1;}
}
else if("Number"==tdObj.columnContentType && !sortIsAsc){
return function (trObj1,trObj2) { return trObj2.innerHTML*1-trObj1.innerHTML*1;}
}
else if(sortIsAsc){
return function (trObj1,trObj2) { return (trObj1.innerHTML.toUpperCase() > trObj2.innerHTML.toUpperCase())-0.5;}
}
else {
return function (trObj1,trObj2) { return (trObj1.innerHTML.toUpperCase() < trObj2.innerHTML.toUpperCase())-0.5;}
}
}

</script>
<style>
.headerTr{background-color:#cccccc;}
</style>
</head>

<body>
<div style="font-size:10pt;">
注1:用法:需要排序的字段头里:<td columnContentType="Text" onclick="rowSortFun(this);"> 。 <br/>
注2:鉴于很多提出要求前台排序的人,其实并不是真的需要前台排序,所以强列建议慎用前台排序。 <br/>


<br/>

<br/>
注:本页面仅在IE6/FireFox1.5下测试过。其它浏览器或其它版本未经测试。<br/>
注-----:JK:<a href="mailTo:jk_10000@yahoo.com.cn?subject=RowSortSample">JK_10000@yahoo.com.cn</a><br/>
<hr/>
</div>

<table border="1" width="100%" >
<tr class="headerTr">
<td columnContentType="Text" onclick="rowSortFun(this);" > 字符串或其它</td>
<td columnContentType="Number" onclick="rowSortFun(this);" >数字</td>
<td columnContentType="Text" onclick="rowSortFun(this);" >字符串</td>
<td columnContentType="Number" onclick="rowSortFun(this);" >数字</td>
<td >输入框(不需要排序)</td>
</tr>
<tr>
<td>a</td>
<td>2</td>
<td>j</td>
<td>1</td>
<td><input value="1"></td>
</tr>
<tr>
<td>b</td>
<td>1</td>
<td>k</td>
<td>2</td>
<td><input value="连山"></td>
</tr>
<tr>
<td>c</td>
<td>1</td>
<td>j</td>
<td>3</td>
<td><input value="归藏"></td>
</tr>
<tr>
<td>d</td>
<td>0</td>
<td>i</td>
<td>4</td>
<td><input value="周易"></td>
</tr>
<tr>
<td>e</td>
<td>2</td>
<td>m</td>
<td>5</td>
<td><input value="仁者乐山智者乐水"></td>
</tr>

</table>
</body>

</html>
...全文
1685 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyuehen 2007-08-17
  • 打赏
  • 举报
回复
mark
JK_10000 2007-08-16
  • 打赏
  • 举报
回复
结贴总结:
1。arrayObj.reverse()几乎不花时间
2。排序函数里要尽量减少对象的调用层次
3。对象数组按对象某个属性排序的话,可以先转化成一个String数组(其值为排序的属性),把对象附在String上,排完序后,再把按序取出String所附的对象。这样能排序速度快很多。
JK_10000 2007-08-14
  • 打赏
  • 举报
回复
楼上朋友的代码,
代码对小数位数确定的数有效。
chaircat 2007-08-11
  • 打赏
  • 举报
回复
用这个比较数字的话...
function getSortFun_cc(tdObj){
if("Number"==tdObj.columnContentType){
return function (trObj1,trObj2) {
if(trObj1.length>trObj2.length)
return 1;
else if(trObj1.length<trObj2.length)
return -1;
else
return trObj1-trObj2;
}
}
else return null;
}

用最新的"版本"设置needCache=false,同一组数据,5K个1~1000的随机数...
计时如下...
**用getSortFun_cc():
5969 6000
5657 5500
5875 5531
5797 5735
**用原先的版本:
6250 6063
6047 6141
6031 6125
5984 6437

好像快不了很多...
不过我想如果数字之间相差比较远的话会好一点...
chaircat 2007-08-11
  • 打赏
  • 举报
回复
汗一个...
之前想的sort()不用自定义函数没有考虑到数字11会比5小...
我再研究下怎样比较数字...
hbhbhbhbhb1021 2007-08-10
  • 打赏
  • 举报
回复
开了好几个测试的,生成数组的那句话传错了.
if(sortType=="numberTd")
rowsArray[i-1]=new String(currentTbody.rows[i].cells[currentColumnIndex].aaa);
else
rowsArray[i-1]=new String(currentTbody.rows[i].cells[currentColumnIndex].innerHTML.toUpperCase());

后面的那个排序上面的是还是有问题的
不过按位数生成应该可以做到啊

上面那个测试用例,如果用Ultraedit可以在替换的时候把正则钩上,然后把aaa="a^(?^)"替换成aaa="a0^1"这样位数就可以做到一样了.

看起来效率还可以,比innerHTML要快一些,不过这是把时间转到初始化上了

JK_10000 2007-08-10
  • 打赏
  • 举报
回复
在ff下有个bug:sort()里不能传null进去.
作了一下相应的改动:
<script language="javascript" srccccc="CommonJS_RowSort.js">
var rowSortImg=document.createElement("img");
function rowSortFun(tdObj,needCache){
var d1=new Date();
if(needCache==null) needCache=true;//default value is true;
var currentColumnIndex=tdObj.cellIndex;
if(rowSortImg.parentNode != tdObj){
tdObj.appendChild(rowSortImg);
rowSortImg.src="up.gif";
}
else if (rowSortImg.src.indexOf("down.gif")>-1){
rowSortImg.src="up.gif";
}
else{
rowSortImg.src="down.gif";
}
var currentTbody=tdObj.parentNode.parentNode;
var rowsArray=new Array();
if(needCache && tdObj.rowsArray){
rowsArray=tdObj.rowsArray;
}
else{
var rows=currentTbody.rows;
for( var i=1;i<rows.length;i++){
rowsArray[i-1]=new String(rows[i].cells[currentColumnIndex].innerHTML.toUpperCase());
rowsArray[i-1].trObj=rows[i];
}
var fun=getSortFun(tdObj);
if(getSortFun(tdObj)) rowsArray.sort(fun);
else rowsArray.sort();
if(needCache) tdObj.rowsArray=rowsArray;
}
var sortIsAsc=(rowSortImg.src.indexOf("up.gif")>-1);
if(!sortIsAsc) rowsArray.reverse();
for(var i=0;i<rowsArray.length;i++){
currentTbody.appendChild(rowsArray[i].trObj);
}
if(!sortIsAsc) rowsArray.reverse();
alert("行数"+rowsArray.length+";所花毫秒数"+(new Date()-d1));
}

function getSortFun(tdObj){
if("Number"==tdObj.columnContentType){
return function (trObj1,trObj2) {return trObj1-trObj2;}
}
else return null;
}
</script>
JK_10000 2007-08-10
  • 打赏
  • 举报
回复
hbhbhbhbhb1021(天外水火(我要多努力)) ( ) 信誉:100 2007-08-10 10:53:45 得分: 0
测试了下,加属性会变快,和字符串是一样的速度了
生成测试代码的文件,把table考过来,太长就不刷屏了
-------------
你加的属性没有派上用场啊
整度一样的原因是你没有传sortFun进去,它就按字符来排序,11会小于5
JK_10000 2007-08-10
  • 打赏
  • 举报
回复

按照“是第一次排完序后就记下该列排序后的rowsArray,第二次排序时就可以不用重新排序。”的思路:
代码改成如下,在第二次排序时,时间再快40%左右.

<script language="javascript" srccccc="CommonJS_RowSort.js">
var rowSortImg=document.createElement("img");
function rowSortFun(tdObj,needCache){
var d1=new Date();
if(needCache==null) needCache=true;//default value is true;
var currentColumnIndex=tdObj.cellIndex;
if(rowSortImg.parentNode != tdObj){
tdObj.appendChild(rowSortImg);
rowSortImg.src="up.gif";
}
else if (rowSortImg.src.indexOf("down.gif")>-1){
rowSortImg.src="up.gif";
}
else{
rowSortImg.src="down.gif";
}
var currentTbody=tdObj.parentNode.parentNode;
var rowsArray=new Array();
if(needCache && tdObj.rowsArray){
rowsArray=tdObj.rowsArray;
}
else{
var rows=currentTbody.rows;
for( var i=1;i<rows.length;i++){
rowsArray[i-1]=new String(rows[i].cells[currentColumnIndex].innerHTML.toUpperCase());
rowsArray[i-1].trObj=rows[i];
}
rowsArray.sort(getSortFun(tdObj));
if(needCache) tdObj.rowsArray=rowsArray;
}
var sortIsAsc=(rowSortImg.src.indexOf("up.gif")>-1);
if(!sortIsAsc) rowsArray.reverse();
for(var i=0;i<rowsArray.length;i++){
currentTbody.appendChild(rowsArray[i].trObj);
}
if(!sortIsAsc) rowsArray.reverse();
alert("行数"+rowsArray.length+";所花毫秒数"+(new Date()-d1));
}

function getSortFun(tdObj){
if("Number"==tdObj.columnContentType){
return function (trObj1,trObj2) {return trObj1-trObj2;}
}
else return null;
}
</script>
btbtd 2007-08-10
  • 打赏
  • 举报
回复
内置的东西都是经过编译的组件...
咱们写的东西都是解释执行的...
低了一个档次...
hbhbhbhbhb1021 2007-08-10
  • 打赏
  • 举报
回复
不过测试的时候,发现快速排序要比sort函数慢,晕倒:)
hbhbhbhbhb1021 2007-08-10
  • 打赏
  • 举报
回复
测试了下,加属性会变快,和字符串是一样的速度了
生成测试代码的文件,把table考过来,太长就不刷屏了
<script language=javascript>
var obj=document.getElementsByTagName("table")[0].childNodes[0]
for(var i=0;i<obj.childNodes.length;i++)
{
obj.childNodes[i].childNodes[1].aaa="a"+obj.childNodes[i].childNodes[1].innerHTML
}
document.getElementById("textarea1").value=obj.outerHTML
</script>


下面是排序的代码
<script language="javascript" srccccc="CommonJS_RowSort.js">

function rowSortFun(tdObj,sortType){
var d1=new Date();
var currentColumnIndex=tdObj.cellIndex;
var currentTbody=tdObj.parentNode.parentNode;
var rowsArray=new Array();
var objTd=null;
for( var i=1;i<currentTbody.rows.length;i++){
objTr=currentTbody.rows[i]
//rowsArray[i-1]=new Array(objTr.cells[currentColumnIndex].innerHTML,objTr);
//rowsArray[i-1]=new String(currentTbody.rows[i].cells[currentColumnIndex].innerHTML);
//rowsArray[i-1].trObj=currentTbody.rows[i];
rowsArray[i-1]=new String(currentTbody.rows[i].cells[currentColumnIndex].innerHTML.toUpperCase());
rowsArray[i-1].trObj=currentTbody.rows[i];
}
rowsArray.sort();

for(var i=0;i<rowsArray.length;i++){
currentTbody.appendChild(rowsArray[i].trObj);
//currentTbody.appendChild(rowsArray[i][1]);
}
alert("行数"+rowsArray.length+";所花毫秒数"+(new Date()-d1));
}

</script>
JK_10000 2007-08-10
  • 打赏
  • 举报
回复
另外的一个思路,是第一次排完序后就记下该列排序后的rowsArray,第二次排序时就可以不用重新排序。
还有一个值得改进的地方,是把排序后的对象表现出来,即以下这段:
for(var i=0;i<rowsArray.length;i++){
currentTbody.appendChild(rowsArray[i].trObj);
}
JK_10000 2007-08-10
  • 打赏
  • 举报
回复
加自定义属性会变慢。
以上几次效率提高的思路主要是减少对象的调用层次深度来达到的。

还有一个循环可以减少调用层次深度,可以再快几毫秒:

for( var i=1;i<currentTbody.rows.length;i++){
rowsArray[i-1]=new String(currentTbody.rows[i].cells[currentColumnIndex].innerHTML.toUpperCase());
rowsArray[i-1].trObj=currentTbody.rows[i];
}

--->>>

var rows=currentTbody.rows;
for( var i=1;i<rows.length;i++){
rowsArray[i-1]=new String(rows[i].cells[currentColumnIndex].innerHTML.toUpperCase());
rowsArray[i-1].trObj=rows[i];
}
zwrtv 2007-08-10
  • 打赏
  • 举报
回复
mark
hbhbhbhbhb1021 2007-08-10
  • 打赏
  • 举报
回复
哈哈,后面的方法是快了,数字慢的话可以偷懒放一个隐藏的td存放String.fromCharCode,如果
是IE的话在td上面放个自定义属性应该也可以吧,把数字的排序消耗转换到页面初始化的时候
wishY 2007-08-10
  • 打赏
  • 举报
回复
学习
JK_10000 2007-08-10
  • 打赏
  • 举报
回复
按照chaircat的思路,
再把效率提高百分之十几(如果排序的内容是Text的话):

<script language="javascript" srccccc="CommonJS_RowSort.js">
var rowSortImg=document.createElement("img");
function rowSortFun(tdObj){
var d1=new Date();
var currentColumnIndex=tdObj.cellIndex;
if(rowSortImg.parentNode != tdObj){
tdObj.appendChild(rowSortImg);
rowSortImg.src="up.gif";
}
else if (rowSortImg.src.indexOf("down.gif")>-1){
rowSortImg.src="up.gif";
}
else{
rowSortImg.src="down.gif";
}
var currentTbody=tdObj.parentNode.parentNode;
var rowsArray=new Array();
for( var i=1;i<currentTbody.rows.length;i++){
rowsArray[i-1]=new String(currentTbody.rows[i].cells[currentColumnIndex].innerHTML.toUpperCase());
rowsArray[i-1].trObj=currentTbody.rows[i];
}
rowsArray.sort(getSortFun(tdObj));
var sortIsAsc=(rowSortImg.src.indexOf("up.gif")>-1);
if(!sortIsAsc) rowsArray.reverse();
for(var i=0;i<rowsArray.length;i++){
currentTbody.appendChild(rowsArray[i].trObj);
}
alert("行数"+rowsArray.length+";所花毫秒数"+(new Date()-d1));
}

function getSortFun(tdObj){
if("Number"==tdObj.columnContentType){
return function (trObj1,trObj2) {return trObj1-trObj2;}
}
else return null;
}
</script>

FBugFramework 2007-08-10
  • 打赏
  • 举报
回复
回复人:btbtd(转型(L/C)AMP) ( 一星(中级)) 信誉:100 2007-8-9 15:39:38 得分:0
?

一个高效率的算法一般是在已知结构上搞出来的...

唉...俺只有在了解足够多内容的前提下,,,
才有办法搞...
----------

ding 他的。
llddy 2007-08-10
  • 打赏
  • 举报
回复
<tr><td>a</td><td>23</td></tr>
<tr><td>b</td><td>17</td></tr>
<tr><td>i</td><td>49</td></tr>
<tr><td>l</td><td>22</td></tr>
<tr><td>g</td><td>25</td></tr>
<tr> </tr>
<tr><td>l</td><td>8</td></tr>
<tr><td>f</td><td>33</td></tr>
<tr><td>j</td><td>41</td></tr>
<tr><td>f</td><td>12</td></tr>
<tr><td>a</td><td>6</td></tr>
<tr><td>i</td><td>11</td></tr>
<tr><td>k</td><td>0</td></tr>
<tr><td>j</td><td>19</td></tr>
<tr><td>b</td><td>20</td></tr>
<tr><td>n</td><td>7</td></tr>
<tr><td>k</td><td>38</td></tr>
<tr><td>e</td><td>13</td></tr>
<tr><td>j</td><td>10</td></tr>
<tr><td>h</td><td>18</td></tr>
<tr><td>f</td><td>7</td></tr>
<tr><td>a</td><td>10</td></tr>
<tr><td>m</td><td>16</td></tr>
<tr><td>h</td><td>5</td></tr>
<tr><td>h</td><td>18</td></tr>
<tr><td>j</td><td>23</td></tr>
<tr><td>b</td><td>22</td></tr>
<tr><td>n</td><td>10</td></tr>
<tr><td>m</td><td>0</td></tr>
<tr><td>h</td><td>3</td></tr>
<tr><td>m</td><td>24</td></tr>
<tr><td>n</td><td>43</td></tr>
<tr><td>a</td><td>25</td></tr>
<tr><td>j</td><td>29</td></tr>
<tr><td>n</td><td>4</td></tr>
<tr><td>m</td><td>29</td></tr>
<tr><td>e</td><td>42</td></tr>
<tr><td>f</td><td>9</td></tr>
<tr><td>g</td><td>18</td></tr>
<tr><td>m</td><td>12</td></tr>
<tr><td>i</td><td>37</td></tr>
<tr><td>a</td><td>36</td></tr>
<tr><td>c</td><td>16</td></tr>
<tr><td>h</td><td>37</td></tr>
<tr><td>e</td><td>8</td></tr>
<tr><td>m</td><td>26</td></tr>
<tr><td>g</td><td>43</td></tr>
<tr><td>n</td><td>30</td></tr>
<tr><td>h</td><td>40</td></tr>
<tr><td>m</td><td>6</td></tr>
<tr><td>k</td><td>46</td></tr>
<tr><td>i</td><td>17</td></tr>
<tr><td>a</td><td>30</td></tr>
<tr><td>c</td><td>32</td></tr>
<tr><td>k</td><td>26</td></tr>
<tr><td>n</td><td>33</td></tr>
<tr><td>n</td><td>39</td></tr>
<tr><td>i</td><td>40</td></tr>
<tr><td>e</td><td>33</td></tr>
<tr><td>j</td><td>31</td></tr>
<tr><td>e</td><td>39</td></tr>
<tr><td>g</td><td>7</td></tr>
<tr><td>f</td><td>3</td></tr>
<tr><td>d</td><td>20</td></tr>
<tr><td>f</td><td>7</td></tr>
<tr><td>h</td><td>8</td></tr>
<tr><td>a</td><td>29</td></tr>
<tr><td>j</td><td>30</td></tr>
<tr><td>l</td><td>8</td></tr>
<tr><td>a</td><td>46</td></tr>
<tr><td>b</td><td>34</td></tr>
<tr><td>i</td><td>25</td></tr>
<tr><td>e</td><td>3</td></tr>
<tr><td>l</td><td>39</td></tr>
<tr><td>i</td><td>4</td></tr>
<tr><td>l</td><td>22</td></tr>
<tr><td>l</td><td>31</td></tr>
<tr><td>f</td><td>4</td></tr>
<tr><td>k</td><td>38</td></tr>
<tr><td>m</td><td>48</td></tr>
<tr><td>a</td><td>43</td></tr>
<tr><td>a</td><td>47</td></tr>
<tr><td>c</td><td>36</td></tr>
<tr><td>l</td><td>2</td></tr>
<tr><td>c</td><td>9</td></tr>
<tr><td>f</td><td>35</td></tr>
<tr><td>f</td><td>14</td></tr>
<tr><td>m</td><td>15</td></tr>
<tr><td>n</td><td>39</td></tr>
<tr><td>n</td><td>19</td></tr>
<tr><td>f</td><td>45</td></tr>
<tr><td>a</td><td>19</td></tr>
<tr><td>d</td><td>27</td></tr>
<tr><td>i</td><td>13</td></tr>
<tr><td>a</td><td>27</td></tr>
<tr><td>i</td><td>49</td></tr>
<tr><td>g</td><td>33</td></tr>
<tr><td>n</td><td>38</td></tr>
<tr><td>n</td><td>15</td></tr>
<tr><td>d</td><td>25</td></tr>
<tr><td>n</td><td>30</td></tr>
<tr><td>e</td><td>39</td></tr>
<tr><td>l</td><td>38</td></tr>
<tr><td>k</td><td>10</td></tr>
<tr><td>a</td><td>5</td></tr>
<tr><td>a</td><td>22</td></tr>
<tr><td>h</td><td>10</td></tr>
<tr><td>g</td><td>3</td></tr>
<tr><td>m</td><td>36</td></tr>
<tr><td>m</td><td>40</td></tr>
<tr><td>h</td><td>42</td></tr>
<tr><td>j</td><td>3</td></tr>
<tr><td>h</td><td>25</td></tr>
<tr><td>k</td><td>0</td></tr>
<tr><td>g</td><td>21</td></tr>
<tr><td>n</td><td>24</td></tr>
<tr><td>g</td><td>14</td></tr>
<tr><td>f</td><td>2</td></tr>
<tr><td>d</td><td>4</td></tr>
<tr><td>e</td><td>13</td></tr>
<tr><td>l</td><td>28</td></tr>
<tr><td>e</td><td>42</td></tr>
<tr><td>e</td><td>14</td></tr>
<tr><td>j</td><td>41</td></tr>
<tr><td>c</td><td>39</td></tr>
<tr><td>g</td><td>33</td></tr>
<tr><td>i</td><td>4</td></tr>
<tr><td>d</td><td>37</td></tr>
<tr><td>l</td><td>34</td></tr>
<tr><td>g</td><td>36</td></tr>
<tr><td>f</td><td>10</td></tr>
<tr><td>a</td><td>2</td></tr>
<tr><td>m</td><td>2</td></tr>
<tr><td>a</td><td>33</td></tr>
<tr><td>c</td><td>26</td></tr>
<tr><td>n</td><td>11</td></tr>
<tr><td>n</td><td>40</td></tr>
<tr><td>h</td><td>21</td></tr>
加载更多回复(25)

87,916

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧