排序算法——二分插入排序

思路

二分插入排序是插入排序的改进版,思路如下:

① 取数组的第一个元素认为已经排好序了

② 依次遍历数组中的元素,每次遍历过程中用二分查找找到已排序数组中,最后一个大于当前被遍历元素的位置

③ 将当前元素插入②找到的位置

④ 遍历完成后排序完成

前置技能

二分查找

在一个有序数组arr中寻找一个数的位置。

① 定义一个索引 left=0,right=arr.length-1 ,mid=(left+right)/2向下取整

② 若target>arr[mid] ,则left=mid+1,若target<arr[mid],则right=mid-1,若target==arr[mid] ,则查找结束

③ 递归执行② ,执行完后返回-1,表示没找到

javascript实现如下:

function binarySearh(arr,target){
    if(!(arr instanceof Array) || !arr.length) return -1;
    var left=0,
        right=arr.length-1,
        mid;
    while(left<=right){
        mid=Math.floor((left+right)/2);
        if(target<arr[mid]){
            right=mid-1;
        }
        else if(target>arr[mid]){
            left=mid+1;
        }
        else{
            return mid;
        }
    }
    return -1;
}

javascript实现

function binarySearchInsertionSort(arr){
    if(!(arr instanceof Array)) return [];
    if(arr.length<=1) return arr;
    // cur 当前处理的数字   left、right二分查找第一个>=当前元素的位置的index,查找区间的左右index,中间index
    var i,cur,left,right,mid;
    for(i=1;i<arr.length;i++){
        left=0;
        right=i-1;
        cur=arr[i];
        //用二分查找找到第一个大于当前元素的索引
        while(left<=right){
            mid=Math.floor((left+right)/2);
            if(cur<arr[mid]){
                right=mid-1;
            }
            else{
                left=mid+1;
            }
        }
        //插入元素
        arr.splice(left,0,arr.splice(i,1)[0]);
    }
    return arr;
}
原文地址:https://www.cnblogs.com/tzyy/p/4871986.html