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

桃子夭夭發表於2015-10-12

思路

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

① 取陣列的第一個元素認為已經排好序了

② 依次遍歷陣列中的元素,每次遍歷過程中用二分查詢找到已排序陣列中,最後一個大於當前被遍歷元素的位置

③ 將當前元素插入②找到的位置

④ 遍歷完成後排序完成

前置技能

二分查詢

在一個有序陣列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;
}

 

相關文章