JavaScript中的数组排序:sort、冒泡和二分法

示例数组 data=[10,9,8,12] 按照从小到达的顺序排序
一、sort排序
之前一直以为直接data.sort()就可以了,事实表明,基础还是不够扎实,查了一下手册发现sort是这样定义的:

如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

  • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  • 若 a 等于 b,则返回 0。
  • 若 a 大于 b,则返回一个大于 0 的值。

所以要实现这个功能需要自定义函数

var data = [10,9,8,17];
function createComparisonFunction(value1,value2){
    return value1-value2;
}
console.log(data.sort(createComparisonFunction));

二、冒泡法实现

var data = [10,9,8,17];
function bubbleSorting(data){
    for(let i=0;i<data.length-1;i++){
        for(let j=0;j<data.length-i-1;j++){
            if(data[j] > data[j+1]){
                let tmpdata;
                tmpdata = data[j];
                data[j] = data[j+1];
                data[j+1] = tmpdata;
            }
        }
    }
    return data;
}
console.log(bubbleSorting(data));

三、二分法

var data = [10,9,8,17];
function dichotomy(data){
    if(data.length <= 1){
        return data;
    }
    let middelValue = parseInt(data.splice(Math.floor(data.length/2),1));
    let leftData = [];
    let rightData=[];
    for(let i=0;i<data.length;i++){
        if(parseInt(data[i]) < middelValue){
            leftData.push(data[i]);
        }else{
            rightData.push(data[i]);
        }
    }
    return dichotomy(leftData).concat(middelValue,dichotomy(rightData));
}
console.log(dichotomy(data));
阅读 170

推荐阅读
web之路
用户专栏

记录工作和学习过程中遇到的问题和心得!

0 人关注
4 篇文章
专栏主页