首先说一下二分法排序的原理,算法思想简单描述:
在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
中间的那个元素比,如果小,则对前半再进行折半,否则对后半
进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
的所有元素后移,再把第i个元素放在目标位置上。
二分法排序最重要的一个步骤就是查找要插入元素的位置,也就是要在哪一个位置上放我们要准备排序的这个元素。
当我们查找到位置以后就很好说了,和插入排序一样,将这个位置以后的所有元素都向后移动一位。这样就实现了二分法排序。
然后是怎么查找着一个位置呢,就是不断的比较已排序的序列中的中间元素和要排序元素,如果大于的话,说明这个要排序的元素在已排序序列中点之前的序列。
var arr = [3,2,23,4,9,1,44,34,9];
function two(){
var len = arr.length;
var left = 0, right = 0, point = 0; //定义三个标记位,point就是最中间的位置
var nArr = [];
nArr[0] = arr[0]; //定义一个数组后,把arr中第一个数先赋给nArr
for(var i=1; i<len; i++){
left = 0;
var nLen = nArr.length;
right = nLen;
for(var j=0; j<nLen; j++){
point = Math.floor((left + right)/2); //取整
if(nArr[point] < arr[i]){
left = point + 1; //注意必须加1
}else{
right = point;
}
if(right == left){ //如果right和left相等就表示找到了插入的位置 ,插入后,跳出循环
nArr.splice(left,0,arr[i]);
break;
}
}
}
console.log(nArr);
}