问题是:关于sort是如何进行排序,最好将代码写上。以下是实例代码
<script type="application/javascript">
function test(){
var array=[1,3,7,5,4];
array.sort(function(m,n){
alert("m:"+m+" "+"n:"+n);
if(m>n)return -1;
if(m<n)return 1;
}); alert(array.join("|"));}
</script><body>
<input type="button" value="Go" onclick="test()" />
</body>
此外,我发现不同的浏览器,他们m与n的值出现顺序,排序的次数都是不一样的,
谷歌10.0.648.205出现的顺序为
m n
1 3
1 7
3 7
1 5
3 5
7 5
1 4
3 4
5 4
opera
1 3
5 4
7 5
1 7
3 7
3 5
3 4
是难道不同浏览器对sort有不同的解释?
另外,由于我不知道sort()方法的代码,所以我对参数内使用排序函数也一知半解。恳请各位帮助
<script type="application/javascript">
function test(){
var array=[1,3,7,5,4];
array.sort(function(m,n){
alert("m:"+m+" "+"n:"+n);
if(m>n)return -1;
if(m<n)return 1;
}); alert(array.join("|"));}
</script><body>
<input type="button" value="Go" onclick="test()" />
</body>
此外,我发现不同的浏览器,他们m与n的值出现顺序,排序的次数都是不一样的,
谷歌10.0.648.205出现的顺序为
m n
1 3
1 7
3 7
1 5
3 5
7 5
1 4
3 4
5 4
opera
1 3
5 4
7 5
1 7
3 7
3 5
3 4
是难道不同浏览器对sort有不同的解释?
另外,由于我不知道sort()方法的代码,所以我对参数内使用排序函数也一知半解。恳请各位帮助
function test(){
var array=[1,3,7,5,4];
show = [];
i = 0;
array.sort(function(m,n){
show[i++] = "m:"+m+" "+"n:"+n;
// alert("m:"+m+" "+"n:"+n);
if(m>n)return -1;
if(m<n)return 1;
return 0;
});
alert(show.join('\n'));
alert(array.join("|"));}
</script><body>
<input type="button" value="Go" onclick="test()" />
</body>
比如为什么
if(m>n)return -1;
if(m<n)return 1;
sort ()后的数组为7|5|4|3|1;
而
if(m>n)return -1;
if(m<n)return 1;
sort ()后的数组为1|3|4|5|7;
sort方法如果没有参数是按照字母顺序排序的,如果数组中是整数就无法排序了
* Apply insertion sort to small chunks to reduce the number of merge
* passes needed.
*/
for (lo = 0; lo < nel; lo += INS_SORT_INT) {
hi = lo + INS_SORT_INT;
if (hi >= nel)
hi = nel;
for (i = lo + 1; i < hi; i++) {
// 指向当前比较的元素(lo+1)
vec1 = (char *)src + i * elsize;
// 指向当前比较的元素的前一个元素
vec2 = (char *)vec1 - elsize;
for (j = i; j > lo; j--) {
// 比较
CALL_CMP(vec2, vec1);
/* "<=" instead of "<" insures the sort is stable */
if (cmp_result <= 0) {
break;
} /* Swap elements, using "tmp" as tmp storage */
// 交换位置
COPY_ONE(tmp, vec2, elsize);
COPY_ONE(vec2, vec1, elsize);
COPY_ONE(vec1, tmp, elsize);
// 继续和前面的内容作对比
vec1 = vec2;
vec2 = (char *)vec1 - elsize;
}
}
}
没办法 不是同一个组织写的东西 大家的想法也不同
内部机制你可以不考虑简单说 他的sort内部用自己的算法进行调度排序
你所做的就是告诉他 2个值 怎么比较大小
如果你不提供 那么就用默认的方式比较大小
知道怎么比较大小了 那么就可以进行 替换位置排序了
反正排序过程不一定一样 但是相同的输入有相同的输出 这个我想应该是可以保证的
function test(){
var array=["10","9","1","2"];
show = [];
i = 0;
array.sort();
alert(array.join("|"));}
</script><body>
<input type="button" value="Go" onClick="test()" />
</body>
谢谢独自流浪老师,但我看不懂唉……我在代码上做了标识,不知你能否解释下,谢谢了!for (lo = 0; lo < nel; lo += INS_SORT_INT) {//INS_SORT_INT和nel什么意思? T_T
hi = lo + INS_SORT_INT;
if (hi >= nel)
hi = nel;
for (i = lo + 1; i < hi; i++) {
// 指向当前比较的元素(lo+1)
vec1 = (char *)src + i * elsize;//(char *)什么意思唉? :(
// 指向当前比较的元素的前一个元素
vec2 = (char *)vec1 - elsize;
for (j = i; j > lo; j--) {
// 比较
CALL_CMP(vec2, vec1);//这个CALL_CMP是不是指的是sort()里的匿名排序函数?
//由于多个变量不知道什么意思,下面的程序就看不懂了,orz!!
/* "<=" instead of "<" insures the sort is stable */
if (cmp_result <= 0) {//cmp_result哪里来的?+_+
break;
} /* Swap elements, using "tmp" as tmp storage */
// 交换位置
COPY_ONE(tmp, vec2, elsize);
COPY_ONE(vec2, vec1, elsize);
COPY_ONE(vec1, tmp, elsize);
// 继续和前面的内容作对比
vec1 = vec2;
vec2 = (char *)vec1 - elsize;
}
}
}
同感,但是我无法明白匿名函数里的那些返回值有什么具体作用,比如
if(m>n)return -1;
if(m<n)return 1;
就可以让数组内容按降序排列。
再比如:
另外,可以直接把一个无名函数直接放到sort()方法的调用中。如下的例子是将奇数排在前面,偶数排在后面,例子如下: var arrA = [6,2,4,3,5,1];
arrA.sort( function(x, y) ...{
if (x % 2 ==0)
return 11;
if (x % 2 !=0)
return -1;
}
);
document.writeln(arrA);输出:1,5,3,4,6,2
这些东西如果不懂函数执行的具体步骤的话就会一团浆糊唉……纠结