文章标题

今天我看书的时候,看到了javascript的sort排序,对于不是这两种类型 :数值类型或者valueOf()方法返回数值类型的对象类型

我还能理解,但是对于是这两种类型,我百思不得其解,最后去网上找找,弄懂了一些

var values =[0,1,5,10,15];
values.sort();
alert(values); //0,1,10,15,5

结果和我们所想要的不一样

这时可以加上
function compare(value1,value2){
return value1-value2;
}
values.sort(compare);
alert(values); //0,1,5,10,15

但是这个是怎么实现的呢???????????

我在https://github.com/v8/v8/blob/master/src/js/array.js 这个地址上找到了答案,由于资历尚浅,还有许多看不懂的地方

只看了一些主要部分的(下面的代码试用于数组长度在22之内的数组,大于这个数排序的算法就用别的了)

function InsertionSort(a, from, to) {
for (var i = from + 1; i < to; i++) {
  var element = a[i];
  for (var j = i - 1; j >= from; j--) {
    var tmp = a[j];
    var order = comparefn(tmp, element);
    if (order > 0) {
      a[j + 1] = tmp;
    } else {
      break;
    }
  }
  a[j + 1] = element;
}

};

comparefn(tmp, element){
return tmp-element;
}

a代表数组 from 表示要排序的第一个序号(数组从零开始计数的)
to 表示排序的最后一个序号

该算法主要是选择排序的想法,
假设要排序 3,2,4,10,1 从小到大
from=0 to=4
第一遍的时候
i=1
element=3
j=0 这时 tmp=2 3>2 把a[1]=element
j=-1<0 内层循环结束
a[j+1]=a[0]=tmp=2;

i=1 这层情况结束,这时顺序是 2,3,4,10,1

i=2
element=4
由于2和3 都小于4 故都break
同理可得,最后的顺序是1,2,3,4,10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值