问题是:关于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()方法的代码,所以我对参数内使用排序函数也一知半解。恳请各位帮助

解决方案 »

  1.   

    仅仅是实现参数对比的不同(比如说你直接开始对比,我可以排序以后才开始),但是你多加上一个return 0的话,绝对不会有异常情况<script type="application/javascript">
    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>
      

  2.   

    可能我解释地不够清楚,我其实是想知道sort的排序方法,比如是冒泡排序法或者是其他一些方法,不然的话我就无法理解如何用排序函数的返回值来对数组进行排序。
    比如为什么 
         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;
      

  3.   

    我一般是不费那个力气,先arr.sort(),发现顺序不符再arr.reverse()好了
      

  4.   


    sort方法如果没有参数是按照字母顺序排序的,如果数组中是整数就无法排序了
      

  5.   

    这是firefox中使用的jaegermonkey引擎中的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;
                }
            }
        }
      

  6.   

    他们内部用的排序算法不一样
    没办法 不是同一个组织写的东西 大家的想法也不同
    内部机制你可以不考虑简单说 他的sort内部用自己的算法进行调度排序
    你所做的就是告诉他 2个值 怎么比较大小
    如果你不提供 那么就用默认的方式比较大小
    知道怎么比较大小了 那么就可以进行 替换位置排序了
    反正排序过程不一定一样 但是相同的输入有相同的输出 这个我想应该是可以保证的
      

  7.   

    默认是ASCII码,升序排列。超出10的整数排序自然不对,需要参整
      

  8.   

    理上网来老师:“超出10的整数排序自然不对,需要参整”什么意思,是指ASCII中只有0-9而没有9以上的数字,所以对于字符型的比较,的例子输出的是“1|10|2|9”<script type="application/javascript">
    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>
      

  9.   


    谢谢独自流浪老师,但我看不懂唉……我在代码上做了标识,不知你能否解释下,谢谢了!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;
                }
            }
        }
      

  10.   

    "他们内部用的排序算法不一样,没办法 不是同一个组织写的东西 大家的想法也不同"
    同感,但是我无法明白匿名函数里的那些返回值有什么具体作用,比如  
      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
    这些东西如果不懂函数执行的具体步骤的话就会一团浆糊唉……纠结