思路
二分插入排序是插入排序的改进版,思路如下:
① 取数组的第一个元素认为已经排好序了
② 依次遍历数组中的元素,每次遍历过程中用二分查找找到已排序数组中,最后一个大于当前被遍历元素的位置
③ 将当前元素插入②找到的位置
④ 遍历完成后排序完成
前置技能
二分查找
在一个有序数组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; }