思路
二分插入排序是插入排序的改進版,思路如下:
① 取陣列的第一個元素認為已經排好序了
② 依次遍歷陣列中的元素,每次遍歷過程中用二分查詢找到已排序陣列中,最後一個大於當前被遍歷元素的位置
③ 將當前元素插入②找到的位置
④ 遍歷完成後排序完成
前置技能
二分查詢
在一個有序陣列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; }