乐趣区

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));
退出移动版